紅色標註的是spring相關的後處理器,在bean實例化過程的不一樣時機調用相關的後處理接口spring
bean初始化大概分爲5步:緩存
--------執行InstantiationAwareBeanPostProcessor-postProcessBeforeInstantiation(Class<?> beanClass, String beanName)
1.執行構造方法
--------執行MergedBeanDefinitionPostProcessor-postProcessMergedBeanDefinition(RootBeanDefinition mbd, Class<?> beanType, String beanName)
--------執行InstantiationAwareBeanPostProcessor-postProcessAfterInstantiation(Object bean, String beanName)
--------執行InstantiationAwareBeanPostProcessor-postProcessPropertyValues
2.執行set 方法(或者是屬性註解)
3.執行生命週期Aware接口方法,注入須要的對象
---------執行BeanPostProcessor-postProcessBeforeInitialization(Object bean, String beanName)
4.執行afterPropertiesSet
5.執行自定義的init-method方法
---------執行BeanPostProcessor-postProcessAfterInitialization(Object bean, String beanName)post
1.InstantiationAwareBeanPostProcessor--postProcessBeforeInstantiation實例化以前(構造方法執行以前)調用spa
做用:傳入要實例化的對象的class,能夠替換(偷樑換柱)成其餘的class,好比一個代理的class代理
2.MergedBeanDefinitionPostProcessor--postProcessMergedBeanDefinition 構造方法調用以後執行對象
做用:合併class定義接口
使用場景:spring用來緩存屬性註解信息,好比緩存屬性註解信息@Autoware @Resouce 等,實現類 AutowiredAnnotationBeanPostProcessor生命週期
3.InstantiationAwareBeanPostProcessor-postProcessPropertyValues 設置屬性值時調用it
做用:對屬性信息進行一些處理io
使用場景:spring在第二個後處理時緩存了屬性註解信息,這裏就經過緩存取出註解信息,而後將對應的屬性注入進去.實現類AutowiredAnnotationBeanPostProcessor
4.BeanPostProcessor--postProcessAfterInitialization對象已經實例化完(包括構造方法,屬性注入,初始方法等)
做用:對象實例完成之後的後處理
場景:spring aop自動代理,用的就是postProcessAfterInitialization後處理 實現類AnnotationAwareAspectJAutoProxyCreator,經過這個回調,將實例化的對象產生一個代理對象返回