当前位置: 首页 > 知识库问答 >
问题:

spring如何构造和自动布线图

韩峰
2023-03-14

我使用spring已经有一段时间了,但是今天早上我遇到了一些意想不到的行为。由于我自己无法决定这是一个理想的功能还是一个bug,所以我在这里展示它,希望我能得到一些关于为什么会发生这种情况的好解释。

简而言之,我在一个应用程序上下文中定义了多个bean,并且我使用utils创建了两个map bean:map name space,只将我的bean的一部分添加到这些map中。这两个地图有完全相同的条目。然后我自动连接那些地图。一个自动连接使用@autowired注释完成,另一个使用@resource完成

令我惊讶的是,用@autowired注释的bean得到了上下文中的所有bean,而不仅仅是我特意放入映射中的bean。另一个使用@resource注释自动连线的文件中只有预期的两个条目。

我主要感兴趣的是:1。为什么在我当时的上下文中声明的所有bean都出现在@autowired映射中,而不是我添加的bean 2。为什么@resource@autowired会有不同的行为

下面是再现上述场景的工作代码。

这里有一些接口:

package my.testing.pkg;

public interface Foo {
    void doStuff();
}
package my.testing.pkg;

public class FooImpl implements Foo {
    @Override
    public void doStuff() {}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:utils="http://www.springframework.org/schema/util"
       xsi:schemaLocation="
         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
         http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util.xsd">

    <bean id="foo_1" class="my.testing.pkg.FooImpl"/>
    <bean id="foo_2" class="my.testing.pkg.FooImpl"/>
    <bean id="foo_3" class="my.testing.pkg.FooImpl"/>
    <bean id="foo_4" class="my.testing.pkg.FooImpl"/>

    <utils:map id="fooMap1" map-class="java.util.HashMap">
        <entry key="foo_1" value-ref="foo_1"/>
        <entry key="foo_2" value-ref="foo_2"/>
    </utils:map>

    <utils:map id="fooMap2" map-class="java.util.HashMap">
        <entry key="foo_1" value-ref="foo_1"/>
        <entry key="foo_2" value-ref="foo_2"/>
    </utils:map>
</beans>

和再现行为的测试用例:

package my.testing.pkg;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import javax.annotation.Resource;
import java.util.Map;

import static org.junit.Assert.assertEquals;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = "/test-context.xml")
public class SpringMapCreatingTest {
    @Autowired
    private Map<String, Foo> fooMap1;
    @Resource
    private Map<String, Foo> fooMap2;

    @Test
    public void shouldInjectATwoEntriesMap() throws Exception {
        assertEquals("fooMap1 should have to entries", 2, fooMap1.size());
        assertEquals("fooMap2 map should have to entries", 2, fooMap1.size());
    }
}

谢谢你的澄清。

共有1个答案

丁英韶
2023-03-14

请查看文档http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-autowired-annotation-qualifiers

映射/列表不作为“标准”bean注入处理。

看看上面的问题:spring@Autowired能映射吗?https://stackoverflow.com/A/13914052/1517816

 类似资料:
  • 与属性自动装配相比,构造函数自动装配有什么特殊的优势吗……或者普通的优势。?优于迫使团队在Spring启动中使用构造函数自动装配……它有什么特殊的优势吗?两种类型的自动装配的优缺点

  • 我有一个组件如下: 这是另一个类,我在哪里自动连接上面的类: 在上面的自动布线中,我需要使用参数化构造函数。如何传递构造函数参数?

  • 问题内容: 我对的反转如何在Spring。 假设我有一个称为服务的类,它实现了接口。 怎么会这样? 而在我,我怎么会在这个服务的? 我会做以下事情吗? 问题答案: 首先,也是最重要的一点-所有Spring Bean都受到管理-它们“实时”存在于称为“应用程序上下文”的容器中。 其次,每个应用程序都有一个指向该上下文的入口。Web应用程序具有Servlet,JSF使用el-resolver等。此外,

  • 我在我的spring boot应用(spring Hibernate/Data/JPA/Web)中有这个类: pkg实体: pkg存储库: pkg服务: 如果我不创建任何控制器,所有工作,但如果我创建一个控制器: pkg控制器: 我得到这个错误(ConfigController中的autowired ConfigService错误): 第一个问题是:我已经注释了@Transaction的BaseS

  • 我在网上做了很多搜索,但找不到一个使用自动连接构造函数进行单元测试的例子。我正在使用Spring将属性文件中的值自动关联到我的应用程序。我想对我的应用程序进行单元测试。java的start方法,但我有一个自动连接的构造函数,所以我不知道如何实例化MyApp。在没有自动连线属性的情况下,我在单元测试中这样做: 我不想模拟自动布线,因为我需要从属性文件中获取值,并且为了使事情更加复杂,我正在通过注释配

  • 我想知道以下解决方案之间的区别是什么,为什么使用解决方案2?有什么好处吗? 解决方案一: 解决方案2: