Spring bean的生命周期
生命周期
bean从创建 -> 初始化 -> 销毁的过程
默认情况下 bean的生命周期是容器来管理的
我们可以自定义初始化和销毁方法;容器在bean进行到当前生命周期的时候来调用我们自定义的初始化和销毁方法
自定义初始化和销毁的几种方式1.指定初始化和销毁方法
-
xml 指定init-method和destory-method
xml 指定init-method和destory-method
-
通过@Bean指定init-method和destroy-method
@Bean(initMethod="init", destroyMethod="destory") public Car car() { return new Car(); }
说明:初始化和销毁方法均为无参方法
构造器
单实例:在容器启动的什时候创建对象
初始化:对象创建好,并赋值好,调用初始化方法
销毁:容器关闭的时候
多实例:在每次获取的时候创建对象
初始化:获取对象时候,创建对象,并赋值好,调用初始化方法
销毁:不会随容器关闭而销毁;容器不会管理销毁方法
-
通过让Bean实现InitializingBean(定义初始化逻辑);DisposableBean(定义销毁逻辑);
@Component public class Cat implements InitializingBean, DisposableBean{ public Cat() { System.out.println("cat constructor..."); } //初始化方法 @Override public void afterPropertiesSet() throws Exception{ System.out.println("cat...init..."); } //销毁方法 @Override public void destroy() throws Exception { System.out.println("cat...destory..."); } }
-
使用JSR250 (java 注解)
@PostConstruct:在bean创建完成并且属性赋值完成;来执行初始化方法
@PreDestroy:在容器销毁bean之前通知我们进行清理工作
@Component public class Dog implements ApplicationContextAware{ public Dog() { System.out.println("dog constructor..."); } //对象创建并赋值之后调用 @PostConstruct public void init() { System.out.println("dog...@PostConstruct..."); } //容器移除之前 @PreDestroy public void destroy() { System.out.println("dog...@PreDestroy..."); } }
-
BeanPostProcessor【interface】:bean的后置处理器;(针对容器中所有的bean)
在bean初始化前后进行一些处理工作;
postProcessBeforeInitialization:在初始化之前工作
postProcessAfterInitialization:在初始化之后工作
构造器 -> 赋值 -> postProcessBeforeInitialization -> 初始化 -> postProcessAfterInitialization
@Component public class MyBeanPostProcessor implements BeanPostProcessor{ @Override public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessBeforeInitialization..." + beanName + "=>" + beanName); return bean; } @Override public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException { System.out.println("postProcessAfterInitialization..." + beanName + "=>" + beanName); return bean; } }
输出:
postProcessBeforeInitialization...org.springframework.context.event.internalEventListenerProcessor=>org.springframework.context.event.internalEventListenerProcessor
postProcessAfterInitialization...org.springframework.context.event.internalEventListenerProcessor=>org.springframework.context.event.internalEventListenerProcessor
...cat constructor...
postProcessBeforeInitialization...cat=>cat
cat...init...
postProcessAfterInitialization...cat=>cat
容器创建完成...cat...destory...
源码分析:
BeanPostProcessor原理
AbstractAutowireCapableBeanFactory
populateBean(beanName, mbd, instanceWrapper);//给bean进行属性赋值
initializeBean
{
applyBeanPostProcessorsBeforeInitialization(wrappedBean, beanName);
invokeInitMethods(beanName, wrappedBean, mbd);执行自定义初始化
applyBeanPostProcessorsAfterInitialization(wrappedBean, beanName);
}