gpt4 book ai didi

java - spring如何构造和自动接线图

转载 作者:行者123 更新时间:2023-12-01 11:30:57 25 4
gpt4 key购买 nike

我使用 spring 已经有一段时间了,但是今天早上我遇到了一些意想不到的行为。由于我无法自行决定这是否是所需的功能或错误,因此我在这里将其呈现,希望能得到一些关于为什么会发生这种情况的良好解释。

简而言之,我在应用程序上下文中定义了多个 bean,并使用 utils:map namespace 创建了两个映射 bean,仅将部分 bean 添加到了这些映射中。这两个 map 具有完全相同的条目。然后我自动连接这些 map 。一种自动连线是使用 @Autowired 注解完成的,另一种是使用 @Resource

完成的

令我惊讶的是,用 @Autowired 注释的 bean 获得了上下文中的所有 bean,而不仅仅是我专门放入映射中的 bean。另一个使用 @Resource 注释自动连接,其中只有预期的两个条目。

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

这是重现上述场景的工作代码。

这里有一些界面:

package my.testing.pkg;

public interface Foo {
void doStuff();
}

及其实现:

package my.testing.pkg;

public class FooImpl implements Foo {
@Override
public void doStuff() {}
}

Spring 配置文件:

<?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. @Autowired 依赖项将查找与其类型匹配的 bean,在本例中,它将创建按其名称映射的 bean Foo 的映射。当您 Autowiring Bean 列表时,也会发生相同的行为,Spring 将注入(inject)实现该接口(interface)的所有 Bean。
  2. @Resource 依赖项将首先查找与依赖项名称匹配的 bean,例如 fooMap2 并注入(inject)它。

关于java - spring如何构造和自动接线图,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30390287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com