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

时间:2013-10-11 18:02:08

标签: spring spring-mvc

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

在applicationContext.xml中

<bean name="testBean" class="com.test.Example"/>
<bean name="myBean" class="com.test.Example"/>

3 个答案:

答案 0 :(得分:10)

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

见这个简单的测试:

使用此课程

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


}

配置xml:

<bean name="testBean" class="com.test.TestBean"/>
<bean name="myBean" class="com.test.TestBean"/>

带弹簧容器测试的JUnit4:

@Resource
TestBean testBean;

@Resource
TestBean myBean;

@Test
public void test() {

    assertNotNull(testBean);
    assertNotNull(myBean);
    assertFalse(testBean == myBean);
    assertFalse(testBean.test == myBean.test);
}

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

请参阅Spring Doc中的这一部分:

  

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

     

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

     

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

答案 1 :(得分:0)

Spring将在此场景中创建两个实例。 Spring容器为每个bean定义创建一个单例实例。

调用getContext.getBean(&#34; testBean&#34;)时,将始终为testBean bean定义提供相同的实例

调用getContext.getBean(&#34; myBean&#34;)时,将始终为myBean bean定义提供相同的实例。

答案 2 :(得分:0)

是。 Spring将在此场景中创建两个实例。 Spring容器为每个bean定义创建一个单例实例。 EX:

public class Test {

    @SuppressWarnings("resource")
    public static void main(String[] args) {

        ApplicationContext ac = new ClassPathXmlApplicationContext("ws.xml");
        TestBean teatBean = (TestBean) ac.getBean(TestBean.class);
        TestBean myBean1 = (TestBean) ac.getBean(TestBean.class);
        System.out.println("a : " + teatBean.test + " : "
                + teatBean.getName());
        teatBean.setName("a TEST BEAN 1");
        System.out.println("uPdate : " + teatBean.test + " : "
                + teatBean.getName());

        System.out.println("a1 : " + myBean1.test + " : " + myBean1.getName());
        myBean1.setName(" a1 TEST BEAN 10");
        System.out.println("a1 update : " + teatBean.test + " : "
                + myBean1.getName());

    }

}


    <bean class="com.spring4hibernate4.TestBean">
        <constructor-arg name="i" value="1"></constructor-arg>
        <property name="name" value="1-name"></property>
    </bean>

    <bean class="com.spring4hibernate4.TestBean">
        <constructor-arg name="i" value="10"></constructor-arg>
        <property name="name" value="10-name"></property>
    </bean>
</beans>


public class Test {

    @SuppressWarnings("resource")
    public static void main(String[] args) {

        ApplicationContext ac = new ClassPathXmlApplicationContext("ws.xml");
        TestBean teatBean = (TestBean) ac.getBean(TestBean.class);
        TestBean myBean1 = (TestBean) ac.getBean(TestBean.class);
        System.out.println("a : " + teatBean.test + " : "
                + teatBean.getName());
        teatBean.setName("a TEST BEAN 1");
        System.out.println("uPdate : " + teatBean.test + " : "
                + teatBean.getName());

        System.out.println("a1 : " + myBean1.test + " : " + myBean1.getName());
        myBean1.setName(" a1 TEST BEAN 10");
        System.out.println("a1 update : " + teatBean.test + " : "
                + myBean1.getName());

    }

}