生命周期
- 实例化:通过反射调用构造方法创建 Bean 实例
- 属性赋值:把配置文件的值或 IOC 容器中的其他 bean 注入属性中
- 初始化:bean 进入初始化阶段,spring 提供了 3 种方式对 bean 加工处理
- @PostConstruct 注解指定初始化方法
- 实现 InitializingBean 接口,复写 afterPropertiesSet 方法
- @Bean 注册 bean 可以通过 initMethod 属性指定初始化方法
- 使用:到此 bean 完整了,程序可使用
- 销毁:程序关闭,释放资源,销毁 bean
- @PreDestroy 注解指定销毁方法
- 实现 DisposableBean 接口,复写 destroy 方法
- @Bean 注册 bean 可以通过 destroyMethod 属性指定销毁方法
完整流程
- BeanPostProcessor 不能感知当前类
- BeanPostProcessor 会拦截所有 bean
- @Autowired 就是 BeanPostProcessor 实现的
@Component
public class User implements BeanPostProcessor {
// 其他 bean 会进这个方法,User 的 bean 不会走!!!
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
System.out.println("Processing bean: " + beanName + " of type: " + bean.getClass().getName());
if (bean instanceof Dog) {
System.out.println("************************");
}
return BeanPostProcessor.super.postProcessBeforeInitialization(bean, beanName);
}
}
graph TD;
st(start) --> io1[反射创建对象]
io1 --> io2[属性赋值]
io2 --> op1[Aware 感知接口回调]
op1 --> op2[BeanPostProcessor 接口 postProcessBeforeInitialization 方法]
op2 --> op3[@PostConstruct 标注的方法]
op3 --> op4[InitializingBean 接口 afterPropertiesSet 方法]
op4 --> op5[@Bean initMethod 指定的方法]
op5 --> op6[BeanPostProcessor 接口 postProcessAfterInitialization 方法]
op6 --> sub1[使用阶段]
sub1 --> op7[@PreDestroy 标注的方法]
op7 --> op8[DisposableBean 接口 destroy方法]
op8 --> op9[@Bean destroyMethod 指定的方法]
op9 --> e(end)
标签:BeanPostProcessor,生命周期,--,Bean,接口,bean,方法
From: https://www.cnblogs.com/cyrushuang/p/18469825