第三章 spring-bean之AutowireCapableBeanFactory(6)

前言

AutowireCapableBeanFactory接口的實現類是AbstractAutowireCapableBeanFactory。AutowireCapableBeanFactory接口的做用是經過多種方式建立bean,執行bean的生命週期,bean處理,依賴解決等。AutowireCapableBeanFactory提供的功能實在用得太少了,實在不重要。整個設計,實現比較複雜。可是AbstractAutowireCapableBeanFactory裏面一些方法確實整個BeanFactory核心,重要的處理流程。java

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主要有以下功能spring

  • 手動建立bean
  • 手動初始化bean
  • 手動銷燬bean
  • 手動執行BeanPostProcessor對bean的助理
  • 經過class得到class對應的beanNaem(詳情請看:resolveNamedBean方法的實現)

建立bean

| | 實例化 | 初始化 | 依賴解決 | 完整bean處理流程 | ------------ | ------------ | | autowireBean | 否 | 否 | 是 | 否 | | autowireClass | 是 | 否 | 是 | 否 | | configureBean | 否 | 是 | 是 | 否 | | createBead(Class ) | 是 | 是 | 是| 是|緩存

細節以下app

  • 若是傳遞的是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監控post

  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是否須要執行銷燬流程)

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

總結

AbstractAutowireCapableBeanFactory就作了兩件事.net

  • 手動得到spring bean。主要是解決依賴關係。
  • 完整的spring bean生命週期與 spring bean的監控
相關文章
相關標籤/搜索