在单个应用程序上下文中定义两个相同类的bean

ssm*_*ssm 16 spring spring-mvc

如果我定义两个相同类的bean而不给出任何范围.然后将创建多少个类实例.例如

在applicationContext.xml中

<bean name="testBean" class="com.test.Example"/>
<bean name="myBean" class="com.test.Example"/>
Run Code Online (Sandbox Code Playgroud)

Art*_*lpe 11

Spring将创建两个类型的bean,com.test.Example自动装配将用于类型或方法名称(或限定符),请参阅Spring IOC

看到这个简单的测试:

有了这堂课

public static class TestBean {
    static int INT = 1;
    public int test;
    public TestBean() {
        test = INT++;
    }


}
Run Code Online (Sandbox Code Playgroud)

配置xml:

<bean name="testBean" class="com.test.TestBean"/>
<bean name="myBean" class="com.test.TestBean"/>
Run Code Online (Sandbox Code Playgroud)

带弹簧容器测试的JUnit4:

@Resource
TestBean testBean;

@Resource
TestBean myBean;

@Test
public void test() {

    assertNotNull(testBean);
    assertNotNull(myBean);
    assertFalse(testBean == myBean);
    assertFalse(testBean.test == myBean.test);
}
Run Code Online (Sandbox Code Playgroud)

如您所见,此测试不会失败,会创建两个TestBean类型的bean.

在Spring Doc中查看此部分:

byName
按属性名称自动装配.Spring查找与需要自动装配的属性同名的bean.例如,如果bean定义按名称设置为autowire,并且它包含master属性(即,它具有setMaster(..)方法),则Spring会查找名为master的bean定义,并使用它来设置属性.

byType
如果容器中只存在一个属性类型的bean,则允许自动装配属性.如果存在多个,则抛出致命异常,这表示您不能对该bean使用byType自动装配.如果没有匹配的bean,则没有任何反应; 该物业未设定.

构造函数
类似于byType,但适用于构造函数参数.如果容器中没有构造函数参数类型的一个bean,则会引发致命错误.