Bean多实例与单实例
- Spring默认为单实例对象(验证:多次获取,输出地址相同)
- 可以通过设置改成多实例对象:
1,在bean中加入scope=“prototype”(默认为singleton)
2,sington和prototype区别:
(1)设置单实例、多实例。
(2)singleton在加载配置文件时候就会创建单实例对象,prototype在加载配置文件时候不创建对象,在调用getBean方法时候创建多实例对象。 - 也可设置为request或者session,表示一次请求和一次对话(session),把对象放在一次请求中或者一次对话中(session)
Bean生命周期:
Spring 加载xml时会将xml中的bean对象都创建。
(1)通过构造器创建bean实例(无参构造)
(2)为bean的属性设置值和其他bean的引用(set方法)
(2.5)前置处理,在初始化之前执行,需要实现BeanPostProcessor接口(前后置处理都需要配置bean,同时被被配置的xml中所有的bean对象都会执行前后置处理)
(3)调用bean的初始化方法(需要进行配置初始化方法)
(3.5)前置处理,在初始化之后执行,需要实现BeanPostProcessor接口
(4)bean创建完成可以使用了
(5)调用bean销毁方法(需要进行配置初销毁方法,销毁需要手动调用)
测试代码:
java类:
public class TestBeanLife {
private String testSet;
public TestBeanLife() {
System.out.println("第一步:调用无参构造创建实例");
}
public void setTestSet(String testSet) {
this.testSet = testSet;
System.out.println("第二步:通过set方法传入参数");
}
public void initMethod(){
System.out.println("第三步:调用初始化方法");
}
public void destroyMethod(){
System.out.println("第五步:调用销毁方法");
}
}
xml配置:
<bean id="TestBeanLife" class="com.BeanLife.TestBeanLife" init-method="initMethod" destroy-method="destroyMethod">
<property name="testSet" value="测试set在生命周期中的执行"></property>
</bean>
测试:
@Test
public void testBeanLife(){
ApplicationContext context = new ClassPathXmlApplicationContext("beanLife.xml");
TestBeanLife testBeanLife = context.getBean("TestBeanLife", TestBeanLife.class);
System.out.println("第四步:bean创建完成可以使用了" +
"");
System.out.println(testBeanLife);
// 强制转换为ClassPathXmlApplicationContext,然后销毁。因为close是ClassPathXmlApplicationContext的方法
((ClassPathXmlApplicationContext)context).close();
}