Spring 容器中的 Bean是有生命周期的:
- Bean实例的创建
- Bean实例设置属性
- Bean的初始化
- Bean可被IoC容器使用
- 容器关闭,Bean销毁
Spring IoC 容器在对Bean生命周期进行管理时提供了Bean生命周期各个时间点的回调。如:Bean在初始化完成后以及销毁前执行特定的操作。
下面是常用的三种指定特定操作的方法:
- 通过实现InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;
- 通过
元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法; - 注解方式 (@PostConstruct或@PreDestroy)
1、Bean的初始化
在Spring IoC容器的依赖注入中的doCreateBean()方法中,有这么一段代码
|
|
上面这段代码表明在完成依赖注入之后并对Bean进行了初始化
|
|
下面看一下invokeCustomInitMethod方法
|
|
小结
1、spring为bean提供了两种初始化bean的方式,实现InitializingBean接口,实现afterPropertiesSet方法,或者在配置文件中同过init-method指定,两种方式可以同时使用
2、实现InitializingBean接口是直接调用afterPropertiesSet方法,比通过反射调用init-method指定的方法效率相对来说要高点。但是init-method方式消除了对spring的依赖
3、如果调用afterPropertiesSet方法时出错,则不调用init-method指定的方法。
4、如果一个bean被定义为非单例的,那么afterPropertiesSet和init-method在bean的每一个实例被创建时都会执行。单例 bean的afterPropertiesSet和init-method只在bean第一次被实例时调用一次。大多数情况下 afterPropertiesSet和init-method都应用在单例的bean上。
5、init-method需要在配置文件中配置,并且这个方法应该是个无参方法
2、Bean的销毁
当容器关闭时,Bean会被销毁,AbstractApplicationContext中的close()方法:
进入destroyBeans()方法,你会发现销毁调用的过程中会调用DisposableBeanAdapter的destory方法来完成销毁动作的。(如果在这里你会好奇为什么会调用DisposableBeanAdapter的destory方法,那你可以可以看一下创建bean过程中doCreateBean()方法中的registerDisposableBeanIfNecessary()方法调用)