对象生命周期:创建(实例化----初始化)---使用----销毁,而在Spring中,Bean对象周期当然遵从这一过程,但是Spring提供了许多对外接口,允许开发者对三个过程(实例化、初始化、销毁)的前后做一些操作。在Spring Bean中,实例化是为Bean对象开辟空间(构造函数),初始化则是对属性的初始化,属性注入(setter方法注入属性)。
1.Bean自身方法:init-method/destroy-method,通过为配置文件bean定义中添加相应属性指定相应执行方法。
2.Bean级生命周期接口:BeanNameAware、BeanFactoryAware、InitializingBean和DiposableBean这些接口的方法。每个Bean选择实现,可选择各自的个性化操作。
3.容器级生命周期接口方法:这个包括了InstantiationAwareBeanPostProcessor 和 BeanPostProcessor 这两个接口实现(前者继承自后者),一般称它们的实现类为“后处理器“,这些接口是每个bean实例化或初始化时候都会调用。
4.工厂后处理器接口方法:也是容器级别的,但他们是在上下文装置配置文件之后调用(BeanFactoryPostProcessor、 CustomAutowireConfigurer)。
Bean具体生命周期
1.postProcessBeanFactory(ConfigurableListableBeanFactory c):工厂后处理器,这个事故IoC容器(ApplicationContext)初始化一部分。实现:写一个类,实现BeanFactoryPostProcessor接口,重写该方法,并在
Spring配置文件中配置该类的一个bean。
2.postProcessBeforeInstantiation(Class<?>c,String beanName):所有bean对象(注1)实例化之前执行,具体点就是执行每个bean类构造函数之前。 实现:写一个类,实现InstantiationAwareBeanPostProcessor接
口,重写该方法,在Spring配置文件中配置该类的一个bean。返回一个Object,但是实际上你返回一个null即可。
3.Bean实例化,调用bean类构造函数。
4.postProcessAfterInstantiation(Object bean,String beanName):bean类实例化之后,初始化之前调用。
5.postProcessPropertyValue:属性注入之前调用。
6.setBeanName(String beanName):属性注入后调用,该方法作用是让bean类知道自己所在的Bean的name或者id属性。
7.setBeanFactory(BeanFactory factory):setBeanName后调用,该方法作用是让bean类知道自己所在的BeanFactory的属性。
8.postProcessBeforeInitialization(Object bean,String beanName):BeanPostProcessor作用是对bean实例化、初始化做些预处理操作。
9.postProcessBeforeInitialization(Object bean,Strign beanName)
10.afterPropertiesSet():bean类实现InitializingBean接口,重写该方法。初始化工作,但实现该接口这种方法和Spring耦合,不推荐。
11.postProcessAfterInitialization(Object bean,Strign beanName)
12.postProcessAfterInitialization(Object bean,Strign beanName)
13.程序执行,bean工作
14.destroy():bean销毁前执行。
15.xml_destroy():实现:spring bean配置文件中配置bean属性destroy-method=”xml_destroy”,这个方法名开发者自己定义。
总结:
实例化》初始化》使用》销毁