1. 程式人生 > >第三章 spring-bean之AutowireCapableBeanFactory(6)

第三章 spring-bean之AutowireCapableBeanFactory(6)

前言

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監控

  1. 開始建立bean ,呼叫createBean()方法
  2. 執行InstantiationAwareBeanPostProcessor.postProcessBeforeInstantiation方法(被resolveBeforeInstantiation方法呼叫)
    1. 如果有過有物件返回,
  3. doCreateBean開始其他流程
    1. createBeanInstance例項化bean操作,
      1. 呼叫determineConstructorsFromBeanPostProcessors方法(該方法會呼叫SmartInstantiationAwareBeanPostProcessor.determineCandidateConstructors方法)
      2. 例項化bean(例項化方式有兩種)
        1. autowireConstructor()
        2. instantiateBean()
    2. applyMergedBeanDefinitionPostProcessors( 方法裡面執行MergedBeanDefinitionPostProcessor.postProcessMergedBeanDefinition)
    3. populateBean
      1. InstantiationAwareBeanPostProcessor.postProcessAfterInstantiation
      2. InstantiationAwareBeanPostProcessor.postProcessPropertyValues
    4. initializeBean
      1. invokeAwareMethods( 注入aware子介面)
      2. applyBeanPostProcessorsBeforeInitialization(裡面呼叫BeanPostProcessor.postProcessBeforeInitialization)
      3. invokeInitMethods(初始化spring bean)
      4. applyBeanPostProcessorsAfterInitialization(裡面呼叫beanProcessor.postProcessAfterInitialization)
    5. registerDisposableBeanIfNecessary (檢查bean是否需要執行銷燬流程)

在這鳥菜啊說句:抱歉。這麼複雜的原始碼流程,實在沒有辦法用一種比較可讀,流利的文字給描述出來,大家可以按照文字表示的流程,逐步觀看。多看幾次,就可以看懂了。

總結

AbstractAutowireCapableBeanFactory就做了兩件事

  • 手動獲得spring bean。主要是解決依賴關係。
  • 完整的spring bean生命週期與 spring bean的監控