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



如果我定义同一类的两个豆子并且没有给出任何范围。然后将创建多少个类实例。例如

在应用程序上下文中.xml

<bean name="testBean" class="com.test.Example"/>
<bean name="myBean" class="com.test.Example"/>
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 查找与需要自动连线的属性同名的 bean。例如,如果一个 Bean 定义设置为按名称自动连线,并且它包含一个 master 属性(即,它有一个 setMaster(..) 方法),Spring 会查找一个名为 master 的 Bean 定义,并使用它来设置该属性。

按类型
如果容器中正好存在一个属性类型的 Bean,则允许自动连接属性。如果存在多个,则会引发致命异常,指示您不能对该 Bean 使用 byType 自动连线。如果没有匹配的豆子,什么都不会发生;未设置该属性。

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

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

当你调用getContext.getBean("testBean")时,将始终为你提供相同的testBeanbean定义实例

当你调用getContext.getBean("myBean")时,将始终为你提供相同的myBean bean定义实例。

是的。在这种情况下,Spring 将创建两个实例。Spring 容器为每个 Bean 定义创建一个单例实例。前任:

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());
    }
}

最新更新