如果我定义同一类的两个豆子并且没有给出任何范围。然后将创建多少个类实例。例如
在应用程序上下文中.xml
<bean name="testBean" class="com.test.Example"/>
<bean name="myBean" class="com.test.Example"/>
创建两个 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());
}
}