Bean的生命周期
- 一个对象的生命周期包括创建(实例化与初始化)使用以及销毁等阶段,在Spring中,Bean对象周期也遵循这一过程,但是Spring提供了许多对外接口,允许开发者对3个过程(实例化,初始化,销毁)的前后做一些操作。在Spring Bean中,实例化是为Bean对象开辟空间,初始化则对属性初始化。
- spring容器可以管理singleton的作用域Bean的生命周期,在此作用域下,Spring能够精确地知道Bean何时被创建,何时初始化完成,以及何时被销毁。而对于prototype作用域的Bean,Spring只负责创建,当容器创建了Bean的实例后,Bean的实例就交给了客户端的代码管理,Spring容器将不再跟踪其生命周期,并且不会管理那些配置成prototype作用域的Bean。Spring中Bean的生命周期的执行是一个很复杂的过程,可借鉴Servlet的生命周期“实例化----》初始化–》(init)-----》接收请求(service)—》销毁(destroy)来理解bean的生命周期
Bean的生命周期的整个过程
(1)根据Bean的配置情况实例化一个Bean
(2)根据spring上下文实例化的Bean进行依赖注入,即对Bean的属性进行初始化操作。
(3)如果Bean实现类BeanNameAware接口,将调用它实现的setBeanName(String beanId)方法,此处参数传递的是Spring配置文件中Bean的id。
(4)如果Bean实现了BeanFactoryAware接口,将调用它实现的setBeanFactory方法,此处参数传递的是当前Spring工厂实例的引用。
(5)如果Bean实现了ApplicationContextAware接口,将调用它实现的 setApplicationContext(ApplicationContext)方法,此处参数传递的是Spring上下文的引用。
(6)如果Bean关联了BeanPostProcessor接口,将调用初始化方法postProcessBeforeInitialization(Object obj,String s)对Bean进行操作。
(7)如果Bean实现了InitializeingBean接口,将调用afterPropertiesSet方法。
(8)如果Bean在Spring配置文件中配置了init-method属性,将自动调用其配置的初始化方法。
(9)如果Bean关联了BeanPostProcessor接口,将调用postProcessAfterInitialzation(Object obj,String s)方法,由于是在Bean初始化结束时调用After方法,也可用于内存或缓存技术。
注意:以上工作完成后就可以使用该Bean,由于该Bean的作用域是singleton,所有调用的是同一个Bean实例
(10)当bean不再需要时将进行销毁阶段,如果Bean实现了DisposableBean接口,则调用其实现的destroy方法将Spring中的Bean销毁。
(11)如果在配置文件中通过destroy-method属性指定了Bean的销毁方法,将调用其配置的销毁方法进行销毁。
在Spring中,可以随意配置<bean 元素的属性,但不建议过多地使用Bean实现接口,因为这样将时代码和Spring聚合比较紧密。
1.创建Bean的实现类
package life;
public class BeanLife {
public void initMySelf(){
System.out.println(this.getClass()+"执行自定义的初始化工具");
}
public void destroyMyself(){
System.out.println(this.getClass().getName()+"执行自定义的销毁方法");
}
}
2.配置Bean
在Spring配置文件中使用实现类BeanLife配置一个id为beanLife的Bean。
<!--配置bean,使用init-method属性指定初始化方法,使用destroy-method属性指定销毁方法-->
<bean id="beanLife" class="life.BeanLife" init-method="initMySelf" destroy-method="destroyMyself"/>
3测试生命周期
package test;
import life.BeanLife;
import org.springframework.context.support.ClassPathXmlApplicationContext;
public class TestLife {
public static void main(String[] args) {
//为了方便演示销毁方法的执行 加载配置文件 这里使用ClassPathXmlApplicationContext
ClassPathXmlApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext");
System.out.println("获得对象前:");
BeanLife beanLife=(BeanLife)ctx.getBean("beanLife");
System.out.println("获得对象后"+beanLife);
ctx.close();
}
}
结果
- 在配置文件时执行了Bean的初始化方法initMyself;在获取对象后,关闭容器时,执行了Bean的销毁方法。