第三章 spring-bean之AutowireCapableBeanFactory(6)
阿新 • • 發佈:2018-11-28
前言
AutowireCapableBeanFactory介面的實現類是AbstractAutowireCapableBeanFactory。AutowireCapableBeanFactory介面的作用是通過多種方式建立bean,執行bean的生命週期,bean處理,依賴解決等。AutowireCapableBeanFactory提供的功能實在用得太少了,實在不重要。整個設計,實現比較複雜。但是AbstractAutowireCapableBeanFactory裡面一些方法確實整個BeanFactory核心,重要的處理流程。
AutowireCapableBeanFactory詳解
public interface AutowireCapableBeanFactory extends BeanFactory { <T> T createBean(Class<T> beanClass) throws BeansException; Object createBean(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck) throws BeansException; void autowireBean(Object existingBean) throws BeansException; Object configureBean(Object existingBean, String beanName) throws BeansException; void autowireBeanProperties(Object existingBean, int autowireMode, boolean dependencyCheck) throws BeansException; void applyBeanPropertyValues(Object existingBean, String beanName) throws BeansException; Object initializeBean(Object existingBean, String beanName) throws BeansException; Object applyBeanPostProcessorsBeforeInitialization(Object existingBean, String beanName) throws BeansException; Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) throws BeansException; void destroyBean(Object existingBean); <T> NamedBeanHolder<T> resolveNamedBean(Class<T> requiredType) throws BeansException; Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName) throws BeansException; Object resolveDependency(DependencyDescriptor descriptor, String requestingBeanName, Set<String> autowiredBeanNames, TypeConverter typeConverter) throws BeansException; }
從上面的介面宣告的方法看AutowireCapableBeanFactory主要有如下功能
- 手動建立bean
- 手動初始化bean
- 手動銷燬bean
- 手動執行BeanPostProcessor對bean的助理
- 通過class獲得class對應的beanNaem(詳情請看:resolveNamedBean方法的實現)
建立bean
| | 例項化 | 初始化 | 依賴解決 | 完整bean處理流程 | ------------ | ------------ | | autowireBean | 否 | 否 | 是 | 否 | | autowireClass | 是 | 否 | 是 | 否 | | configureBean | 否 | 是 | 是 | 否 | | createBead(Class ) | 是 | 是 | 是| 是|
細節如下
- 如果傳遞的是object物件,那麼就不需要例項化物件了,
- 完整bean處理流程請看第五章 spring-connet之bean生命週期與bean監控 。如果標記為“否”表示只會經歷InstantiationAwareBeanPostProcessor介面的對bean的處理。詳細請看populateBean方法
- 注意上面所有的方法產生的物件都是非單列物件(所有方法裡面有一行這樣的程式碼 bd.setScope(BeanDefinition.SCOPE_PROTOTYPE) ),同時不會進行任何的快取。
- autowireClass與createBead過載方法中有dependencyCheck是否進行依賴檢查,autowireMode形參是表示自動裝配模式。dependencyCheck為true表示檢查autowireMode模式下的依賴關係
- 注意手動呼叫容器銷燬bean,可能會把依賴的bean也會摧毀
AbstractAutowireCapableBeanFactory
回顧下bean的生命週期與bean監控
- 開始建立bean ,呼叫createBean()方法
- 執行InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法(被resolveBeforeInstantiation方法呼叫)
- 如果有過有物件返回,
- doCreateBean開始其他流程
- createBeanInstance例項化bean操作,
- 呼叫determineConstructorsFromBeanPostProcessors方法(該方法會呼叫SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors方法)
- 例項化bean(例項化方式有兩種)
- autowireConstructor()
- instantiateBean()
- applyMergedBeanDefinitionPostProcessors( 方法裡面執行MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition)
- populateBean
- InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
- InstantiationAwareBeanPostProcessor.postProcessPropertyValues
- initializeBean
- invokeAwareMethods( 注入aware子介面)
- applyBeanPostProcessorsBeforeInitialization(裡面呼叫BeanPostProcessor.postProcessBeforeInitialization)
- invokeInitMethods(初始化spring bean)
- applyBeanPostProcessorsAfterInitialization(裡面呼叫beanProcessor.postProcessAfterInitialization)
- registerDisposableBeanIfNecessary (檢查bean是否需要執行銷燬流程)
- createBeanInstance例項化bean操作,
在這鳥菜啊說句:抱歉。這麼複雜的原始碼流程,實在沒有辦法用一種比較可讀,流利的文字給描述出來,大家可以按照文字表示的流程,逐步觀看。多看幾次,就可以看懂了。
總結
AbstractAutowireCapableBeanFactory就做了兩件事
- 手動獲得spring bean。主要是解決依賴關係。
- 完整的spring bean生命週期與 spring bean的監控