Spring 執行順序:@Autowired 和 @Value 註解

回目錄

代碼:https://gitee.com/free/boot-order/tree/master/src/main/java/com/github/abel533/autowired

結合 PostProcessor 時的執行順序

  1. InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation - userExt
  2. SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors - userExt
  3. UserExt#constructor
  4. InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation - userExt
  5. InstantiationAwareBeanPostProcessor#postProcessProperties - userExt
  6. UserExt@Value("${autowired.testValue}")
  7. UserExt@Value("#{systemProperties['os.name']}")
  8. UserExt@Autowired
  9. BeanPostProcessor#postProcessBeforeInitialization - userExt
  10. BeanPostProcessor#postProcessAfterInitialization - userExt

第 0 步可以通過返回 bean 來替代默認創建實例的方法。

第 1 步可以返回一個可用的構造方法。

第 2 步爲構造方法注入,執行的比字段和方法注入要早(理所當然)

第 3 步時實例已經創建,但是還未注入屬性。

第 4 步時,示例中什麼也沒做,實際上在 AutowiredAnnotationBeanPostProcessor#postProcessProperties 方法中,對 @Autowired@Value 的字段或方法進行了注入。

第 5~7 步時,也就是 AutowiredAnnotationBeanPostProcessor 對方法和字段進行注入。

第 8 步時,在執行實例的初始化方法前進行調用。後續會調用 bean 的初始化方法。

第 9 步時,已經執行完成了初始化方法,此時的 bean 已經是最終的結果了,但是你仍然可以在此對 bean 進行處理,例如再包裝一層代理。

結合 Bean 的生命週期時的順序

  1. UserExt#constructor
    構造方法
  2. UserExt@Value("${autowired.testValue}")
    注入
  3. UserExt@Value("#{systemProperties['os.name']}")
    注入
  4. @PostConstruct
    從這兒往下都是初始化和銷燬方法
  5. InitializingBean#afterPropertiesSet
  6. @PostConstruct
  7. InitializingBean#afterPropertiesSet
  8. @Bean(initMethod)
  9. SmartLifecycle#isRunning
  10. SmartLifecycle#start
  11. SmartLifecycle#isRunning
  12. SmartLifecycle#start
  13. SmartLifecycle#isRunning
  14. SmartLifecycle#stop
  15. SmartLifecycle#isRunning
  16. SmartLifecycle#stop
  17. @PreDestroy
  18. DisposableBean#destroy
  19. @Bean(destroyMethod)
  20. @PreDestroy
  21. DisposableBean#destroy

也就是說,在生命週期中,所有注入的數據都已經可以使用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章