IOC - bean 生命週期

CyrusHuang發表於2024-11-02

生命週期

  1. 例項化:透過反射呼叫構造方法建立 Bean 例項
  2. 屬性賦值:把配置檔案的值或 IOC 容器中的其他 bean 注入屬性中
  3. 初始化:bean 進入初始化階段,spring 提供了 3 種方式對 bean 加工處理
    • @PostConstruct 註解指定初始化方法
    • 實現 InitializingBean 介面,複寫 afterPropertiesSet 方法
    • @Bean 註冊 bean 可以透過 initMethod 屬性指定初始化方法
  4. 使用:到此 bean 完整了,程式可使用
  5. 銷燬:程式關閉,釋放資源,銷燬 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)

相關文章