对于prototype作用域的Bean,每次客户端请求spring都会创建一个新的实例,spring容器仅仅负责创建,创建完之后Bean实例完全交给客户端代码来管理,容器不再跟踪其生命周期。
对于singleton作用域的Bean,spring容器知道Bean何时实例化结束、何时销毁和销毁之前的行为。管理Bean的生命周期主要有如下两个时机:
①注入依赖关系之后
②即将销毁Bean之前
1.依赖关系注入之后的行为:
spring提供两种方式在Bean全部属性设置成功后执行特定行为:
①使用init-method属性指定方法。
②实现InitializingBean接口。
第一种代码污染小
第二种需要实现接口里的一个方法void afterPropertiesSet() throws Exception; spring容器自动调用该方法。
如果两种方式同时存在,先执行afterPropertiesSet方法,再执行init-method属性指定的方法。
2.Bean销毁之前的行为:
spring也提供两种方式定制Bean实例销毁之前的特定行为:
①使用destroy-method属性指定方法。
②实现DisposableBean接口。
第一种方式代码污染小。
第二种方式需要实现接口里的一个方法void destroy() throws Exception;容器自动调用该方法。
如果两种方式同时存在,同样先执行接口的方法,再执行destroy-method属性指定的方法。
注意:
当Bean实现了ApplicationContextAware接口、BeanNameAware接口之后,spring容器会在该Bean依赖注入之后、初始化完成之前,也就是调用afterProperties方法(如果有)和init-method所指定的方法(如果有)之前,先回调SetBeanName(String name)、setApplicationContext(ApplicationContext applicationContext)方法。