Определить два beans того же класса в одном контексте приложения

если я определяю два beans того же класса и не дающий какой-либо области. Тогда сколько экземпляров класса будет создано. например

в applicationContext.xml

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

Ответ 1

Spring создаст два beans типа com.test.Example, и автоустановка будет для имени типа или метода (или Квалификаторов), см. 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 с контейнером spring:

@Resource
TestBean testBean;

@Resource
TestBean myBean;

@Test
public void test() {

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

Этот тест не сработает, как вы видите, создаются два beans типа TestBean.

См. эту часть в документе spring Doc:

Byname
Autowiring по названию свойства. spring ищет bean с тем же именем, что и свойство, которое должно быть автообновлено. Например, если для определения bean установлено autowire по имени и оно содержит свойство master (то есть оно имеет метод setMaster (..)), spring ищет определение bean с именем master, и использует его для установки свойства.

ByType
Позволяет авторизовать свойство, если в контейнере существует только один bean типа свойства. Если существует более одного, генерируется фатальное исключение, что указывает на то, что вы не можете использовать autowiring byType для этого bean. Если нет соответствия beans, ничего не происходит; свойство не установлено.

Конструктор
Аналогично toType, но применяется к аргументам конструктора. Если в контейнере нет только одного bean типа аргумента конструктора, возникает фатальная ошибка.

Ответ 2

Spring создаст два экземпляра в этом сценарии. Контейнер Spring создает экземпляр singleton для определения bean.

Когда вы вызываете getContext.getBean( "testBean" ), вы всегда будете давать один и тот же экземпляр для определения testBean bean

Когда вы вызываете getContext.getBean( "myBean" ), вы всегда укажете один и тот же экземпляр для определения myBean bean.

Ответ 3

Да. Spring создаст два экземпляра в этом сценарии. Контейнер Spring создает экземпляр singleton для определения 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());

    }

}