被IOC容器管理的bean的生命周期如下:
-
通过构造器或工厂方法创建 Bean 实例
-
为 Bean 的属性设置值和对其他 Bean 的引用
-
如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给setBeanName()接口方法。
-
如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()方法,把BeanFactory的实现传入给Bean。
-
如果Bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()接口方法,把Application传入给Bean。
-
如果Bean实现了InitializingBean接口,Spring将调用他的afterPropertiesSet方法。类似的,如果配置Bean的时候使用init-method生命了初始化方法,改方法也会在此时调用。
-
如果Bean实现了BeanPostProcessor接口,或者有全局的BeanPostProcessor实现,Spring将调用他的postProcessBeforeInitialization方法。
-
如果Bean实现了BeanPostProcessor接口,或者有全局的BeanPostProcessor实现,Spring将调用他的postProcessBeforeInitialization方法。
-
Bean准备就绪,可以被调用了。一直保留在上下文中,直到上下文销毁。
-
当容器关闭时, 如果Bean实现了DisposableBean接口,Spring将调用他的destroy方法。类似的,如果配置Bean的时候使用destory-method生命了初始化方法,改方法也会在此时调用。
Bean的初始化和销毁:
到bean的初始化和销毁,也就是到了第7步和第10步,我们可以做出单独的处理。
实现方法:
方法一
为Bean定义初始化和销毁操作,只需要使用init-method和destroy-method参数来配置Bean即可,分别指定了对应时刻要调用的方法。
方法二
实现InitializingBean和DisposableBean接口,分别实现afterPropertiesSet()方法和destroy()方法,来达到初始化和销毁的目的;
第二种方法的好处是Spring能够自动的检测实现了这些接口的Bean,而无需额外的配置,缺点是Bean与Spring的API产生了耦合,通常只有在开发一个明确在Spring容器中使用的Bean的时候才会使用第二种方法;
方法三
默认的init-method和destroy-method:
如果在上下文中很多Bean都拥有相同名字的初始化方法和销毁方法,没必要为每一个Bean声明init-method和destroy-method属性,可以使用<beans>元素的default-init-method和default-destroy-method属性:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"
default-init-method="method1"
default-destroy-method="method2">
......
</beans>
这样,如果Bean有对应的方法,就会执行,没有的话,就什么也不做。