上篇文章主要介绍了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。