代碼:https://gitee.com/free/boot-order/tree/master/src/main/java/com/github/abel533/autowired
結合 PostProcessor 時的執行順序
InstantiationAwareBeanPostProcessor#postProcessBeforeInstantiation - userExt
SmartInstantiationAwareBeanPostProcessor#determineCandidateConstructors - userExt
UserExt#constructor
InstantiationAwareBeanPostProcessor#postProcessAfterInstantiation - userExt
InstantiationAwareBeanPostProcessor#postProcessProperties - userExt
UserExt@Value("${autowired.testValue}")
UserExt@Value("#{systemProperties['os.name']}")
UserExt@Autowired
BeanPostProcessor#postProcessBeforeInitialization - userExt
BeanPostProcessor#postProcessAfterInitialization - userExt
第 0 步可以通過返回 bean 來替代默認創建實例的方法。
第 1 步可以返回一個可用的構造方法。
第 2 步爲構造方法注入,執行的比字段和方法注入要早(理所當然)
第 3 步時實例已經創建,但是還未注入屬性。
第 4 步時,示例中什麼也沒做,實際上在 AutowiredAnnotationBeanPostProcessor#postProcessProperties
方法中,對 @Autowired
和 @Value
的字段或方法進行了注入。
第 5~7 步時,也就是 AutowiredAnnotationBeanPostProcessor
對方法和字段進行注入。
第 8 步時,在執行實例的初始化方法前進行調用。後續會調用 bean 的初始化方法。
第 9 步時,已經執行完成了初始化方法,此時的 bean 已經是最終的結果了,但是你仍然可以在此對 bean 進行處理,例如再包裝一層代理。
結合 Bean 的生命週期時的順序
UserExt#constructor
構造方法UserExt@Value("${autowired.testValue}")
注入UserExt@Value("#{systemProperties['os.name']}")
注入@PostConstruct
從這兒往下都是初始化和銷燬方法InitializingBean#afterPropertiesSet
@PostConstruct
InitializingBean#afterPropertiesSet
@Bean(initMethod)
SmartLifecycle#isRunning
SmartLifecycle#start
SmartLifecycle#isRunning
SmartLifecycle#start
SmartLifecycle#isRunning
SmartLifecycle#stop
SmartLifecycle#isRunning
SmartLifecycle#stop
@PreDestroy
DisposableBean#destroy
@Bean(destroyMethod)
@PreDestroy
DisposableBean#destroy
也就是說,在生命週期中,所有注入的數據都已經可以使用。