如果我定义了两个相同类的bean而没有给出任何范围。然后将创建多少个类实例。例如
在applicationContext.xml中
<bean name="testBean" class="com.test.Example"/>
<bean name="myBean" class="com.test.Example"/>
答案 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());
}
}