部分bean的生命周期方法
BeanPostProcessor
这个是容器级别的,也就是说对所有的bean初始化过程都会参与。
public interface BeanPostProcessor {
//初始化前执行
Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception;
//初始化后执行
Object postProcessAfterInitialization(Object bean, String beanName) throws Exception;
}
使用:实现BeanPostProcessor 接口,实现两个方法即可。
public class BeanInitializeLogger implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws Exception {
System.out.println("Initialize bean " + beanName + " start!");
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws Exception {
System.out.println("Initialize bean " + beanName + " end!");
return bean;
}
}
ApplicationContext applicationContext = new ClassPathXmlApplicationContext(“spring.xml”);
初始化的时候构造方法会调用refresh()方法:
- loadBeanDefinitions(beanFactory); 加载xml中的beanDefinition
- registerBeanPostProcessors(beanFactory); 注册beanpostprocessor
- preInstantiateSingletons(); 初始化
在每一个bean创建的时候都会调用BeanPostProcessor的方法
@Override
public Object getBean(String name) throws Exception {
BeanDefinition beanDefinition = beanDefinitionMap.get(name);
if (beanDefinition == null) {
throw new IllegalArgumentException("No bean named " + name + " is defined");
}
Object bean = beanDefinition.getBean();
if (bean == null) {
bean = doCreateBean(beanDefinition);
//执行BeanPostProcessor 方法
bean = initializeBean(bean, name);
}
return bean;
}
protected Object initializeBean(Object bean, String name) throws Exception {
for (BeanPostProcessor beanPostProcessor : beanPostProcessors) {
bean = beanPostProcessor.postProcessBeforeInitialization(bean, name);
}
for (BeanPostProcessor beanPostProcessor : beanPostProcessors) {
bean = beanPostProcessor.postProcessAfterInitialization(bean, name);
}
return bean;
}
BeanFactoryAware
这个是bean级别的,只有实现BeanFactoryAware接口的才会有用。
public interface BeanFactoryAware {
//获取BeanFactory
void setBeanFactory(BeanFactory beanFactory) throws Exception;
}
使用:
public class Person implements BeanFactoryAware {
private BeanFactory beanFactory;
@Override
public void setBeanFactory(BeanFactory beanFactory) throws Exception {
this.beanFactory = (AbstractBeanFactory) beanFactory;
}
}
bean生命周期
参考链接
Spring中Bean的生命周期是怎样的? - 奔跑中的程序猿的回答 - 知乎
https://www.zhihu.com/question/38597960/answer/1663436917
- bean实例化
- bean初始化(设置属性,依赖注入)
- 调用BeanNameAware接口
- 调用BeanFactoryAware接口
- 调用 ApplicationContextAware接口
- beanPostprocessor 初始化前的方法
- InitializingBean的设置属性后置方法
- beanPostprocessor 初始化后的方法
- DisposableBean销毁方法
测试
@Component
public class Person implements BeanFactoryAware, BeanNameAware, InitializingBean, DisposableBean {
private String name;
private BeanFactory beanFactory;
private String beanName;
public Person(){
System.out.println("【 构造器 】 -> 调用Person实例化");
}
public String getName() {
return name;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
public void setName(String name) {
System.out.println("【 注入属性 】 -> 注入属性name");
this.name = name;
}
@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
System.out.println("【 BeanFactoryAware接口 】 -> 调用BeanFactoryAware.setBeanFactory()");
this.beanFactory = beanFactory;
}
@Override
public void setBeanName(String s) {
System.out.println("【 BeanNameAware接口 】 -> 调用BeanNameAware.setBeanName()");
this.beanName = s;
}
//对应通过<bean>的destroy-method属性指定的初始化方法
@Override
public void destroy() throws Exception {
System.out.println("【 DiposibleBean接口 】 -> 调用DiposibleBean.destory()");
}
//对应通过<bean>的init-method属性指定的初始化方法
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("【 InitializingBean接口 】 -> 调用InitializingBean.afterPropertiesSet()");
}
}
@Component
public class CumtomBeanPostprocessor implements BeanPostProcessor {
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Person){
System.out.println("【 BeanPostProcessor 】 -> " + beanName + " start!");
}
return bean;
}
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
if (bean instanceof Person){
System.out.println("【 BeanPostProcessor 】 -> " + beanName + " end!");
}
return bean;
}
}
控制台打印顺序
【 构造器 】 -> 调用Person实例化
【 BeanNameAware接口 】 -> 调用BeanNameAware.setBeanName()
【 BeanFactoryAware接口 】 -> 调用BeanFactoryAware.setBeanFactory()
【 BeanPostProcessor 】 -> person start!
【 InitializingBean接口 】 -> 调用InitializingBean.afterPropertiesSet()
【 BeanPostProcessor 】 -> person end!
【 DiposibleBean接口 】 -> 调用DiposibleBean.destory()