上篇文章主要介绍了FactoryBean接口,实现后,可以注入bean,在ioc容器中默认放的是getObject返回的bean:
Spring源码从入门到精通---FactoryBean接口(六)
这篇文章主要介绍Bean的生命周期,bean的生命周期指:bean的创建--->初始化--->销毁
1、问?bean初始化的时候?
单实例是在容器创建时bean初始化,调用construct。
多实例实在获取实例的时候初始化。
2、问?bean销毁的时候?
单实例在容器关闭的时候销毁。
多实例在容器关闭时候并不会销毁,多实例的对象不归ioc容器管理。
一、单实例生命周期创建和销毁
自定义car,里面写个无参构造方法,init,destory,自定义配置类,用@Bean注解的init-Method来指定初始化方法和destory-Method来指定销毁方法。
public class Car {
public Car(){
System.out.println("car ... construct");
}
private void init(){
System.out.println("car ... init");
}
private void destory(){
System.out.println("car ... destory");
}
}
/**
* bean生命周期:
* bean创建 ---> 初始化 ---> 销毁
* 容器管理bean的生命周期
* 我们可以自定义初始化和销毁,bean进行到当前生命周期的时候,调用自定义的创建和销毁
*
* 单实例,容器创建的时候construct创建对象和init初始化。
* 多实例,获取对象的时候construct创建对象和init初始化。不会交给ioc容器管理,所以容器关
* 闭不会销毁。
* 1)通过@Bean注释 init-method和destory-method的两个方法,指定对象的创建和销毁。
* 什么时候调用:初始化,对象创建完成,并且赋值好,开始调用。
* 销毁,容器关闭的时候调用。(多实例的时候不会调用销毁,因为容器不会管理这个bean)
*
* @author keying
*/
@Configuration
public class ConfigLifeCycle {
//@Scope("prototype")
@Bean(initMethod = "init", destroyMethod = "destory")
public Car car(){
return new Car();
}
}
public class TestLiftCycle {
@Test
public void test() {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
ConfigLifeCycle.class);
System.out.println("容器创建完毕");
//多实例情况下,需要获取组件,才会初始化,并且不会销毁
//Object carObject = annotationConfigApplicationContext.getBean("car");
//getDefinitionNames(annotationConfigApplicationContext);
annotationConfigApplicationContext.close();
}
}
用junit打印之后,可以看到,单实例的情况下,在容器创建完毕之前,会调用构造函数construct创建对象和init初始化,在注解AnnotationConfigApplicationContext获取的容器关闭之后,会调用destory销毁。
二、多实例生命周期创建和销毁
多实例就可以用到之前的注解,吧@Scope指定多实例,并且需要 获取组件,因为多实例在getBean的时候才会创建对象调用construct和调用初始化init方法。
@Scope("prototype")
@Bean(initMethod = "init", destroyMethod = "destory")
public Car car(){
return new Car();
}
@Test
public void test() {
AnnotationConfigApplicationContext annotationConfigApplicationContext = new AnnotationConfigApplicationContext(
ConfigLifeCycle.class);
System.out.println("容器创建完毕");
//多实例情况下,需要获取组件,才会初始化,并且不会销毁
Object carObject = annotationConfigApplicationContext.getBean("car");
//getDefinitionNames(annotationConfigApplicationContext);
annotationConfigApplicationContext.close();
}
结果如下,可以看到,destory并不会调用,并且是在ioc容器加载完毕之后才初始化bean。