生命週期
- 例項化:透過反射呼叫構造方法建立 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)