Spring IoC 初始化之先發五虎

Spring IoC 初始化之先發五虎

  接上文所述,源碼分析來到了 AnnotationConfigApplicationContext() 方法中的 new AnnotatedBeanDefinitionReader(this) 方法。下面就從 new AnnotatedBeanDefinitionReader(this)這一行代碼開始。首先解釋this,這裏this指的是當前類,也即 AnnotationConfigApplicationContext。程序員

1. 代碼入口

/**  * BeanDefinitionRegistry是經過AnnotatedBeanDefinitionReader構造方法中的this傳進來  * 這裏說明 AnnotationConfigApplicationContext 就是 BeanDefinitionRegistry。  */ public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {  this(registry, getOrCreateEnvironment(registry)); } 複製代碼
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry, Environment environment) {
 Assert.notNull(registry, "BeanDefinitionRegistry must not be null");  Assert.notNull(environment, "Environment must not be null");  this.registry = registry;  this.conditionEvaluator = new ConditionEvaluator(registry, environment, null);  /**  * 經過AnnotationConfigUtils.registerAnnotationConfigProcessors()  * 獲取全部BeanPostProcessor 的bean  */  AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry); } 複製代碼

  隆重介紹一下,在AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);方法中會將五個內置的對象經過一些列方法註冊到IoC容器中。這五個對象在IoC中的地位舉足輕重。我稱之爲:先發五虎web

   registerAnnotationConfigProcessors 中經過給定的註冊器,註冊全部註解相關的後置處理器。編輯器

public static void registerAnnotationConfigProcessors(BeanDefinitionRegistry registry) {
 registerAnnotationConfigProcessors(registry, null); } 複製代碼
public static Set<BeanDefinitionHolder> registerAnnotationConfigProcessors(  BeanDefinitionRegistry registry, @Nullable Object source) {  /**  * 經過registry生成一個beanFactory  */  DefaultListableBeanFactory beanFactory = unwrapDefaultListableBeanFactory(registry);  if (beanFactory != null) {  if (!(beanFactory.getDependencyComparator() instanceof AnnotationAwareOrderComparator)) {  /**  * 添加AnnotationAwareOrderComparator類的對象,注意去排序  */  beanFactory.setDependencyComparator(AnnotationAwareOrderComparator.INSTANCE);  }  if (!(beanFactory.getAutowireCandidateResolver() instanceof ContextAnnotationAutowireCandidateResolver)) {  /**  * 提供處理延遲加載的功能  */  beanFactory.setAutowireCandidateResolver(new ContextAnnotationAutowireCandidateResolver());  }  }   Set<BeanDefinitionHolder> beanDefs = new LinkedHashSet<>(8);  /** 註冊BeanDefinition,到Map中*/  if (!registry.containsBeanDefinition(CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME)) {  /**  * ConfigurationClassPostProcessor 的類型是 BeanDefinitionRegistryPostProcessor  * BeanDefinitionRegistryPostProcessor 實現的是 BeanFactoryPostProcessor 接口  *  * RootBeanDefinition 是 BeanDefinition的子類  */  RootBeanDefinition def = new RootBeanDefinition(ConfigurationClassPostProcessor.class);  def.setSource(source);  beanDefs.add(registerPostProcessor(registry, def, CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME));  }   if (!registry.containsBeanDefinition(AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME)) {  RootBeanDefinition def = new RootBeanDefinition(AutowiredAnnotationBeanPostProcessor.class);  def.setSource(source);  beanDefs.add(registerPostProcessor(registry, def, AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME));  }   // Check for JSR-250 support, and if present add the CommonAnnotationBeanPostProcessor.  if (jsr250Present && !registry.containsBeanDefinition(COMMON_ANNOTATION_PROCESSOR_BEAN_NAME)) {  RootBeanDefinition def = new RootBeanDefinition(CommonAnnotationBeanPostProcessor.class);  def.setSource(source);  beanDefs.add(registerPostProcessor(registry, def, COMMON_ANNOTATION_PROCESSOR_BEAN_NAME));  }   // Check for JPA support, and if present add the PersistenceAnnotationBeanPostProcessor.  if (jpaPresent && !registry.containsBeanDefinition(PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME)) {  RootBeanDefinition def = new RootBeanDefinition();  try {  def.setBeanClass(ClassUtils.forName(PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME,  AnnotationConfigUtils.class.getClassLoader()));  }  catch (ClassNotFoundException ex) {  throw new IllegalStateException(  "Cannot load optional framework class: " + PERSISTENCE_ANNOTATION_PROCESSOR_CLASS_NAME, ex);  }  def.setSource(source);  beanDefs.add(registerPostProcessor(registry, def, PERSISTENCE_ANNOTATION_PROCESSOR_BEAN_NAME));  }   if (!registry.containsBeanDefinition(EVENT_LISTENER_PROCESSOR_BEAN_NAME)) {  RootBeanDefinition def = new RootBeanDefinition(EventListenerMethodProcessor.class);  def.setSource(source);  beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_PROCESSOR_BEAN_NAME));  }   if (!registry.containsBeanDefinition(EVENT_LISTENER_FACTORY_BEAN_NAME)) {  RootBeanDefinition def = new RootBeanDefinition(DefaultEventListenerFactory.class);  def.setSource(source);  beanDefs.add(registerPostProcessor(registry, def, EVENT_LISTENER_FACTORY_BEAN_NAME));  }   return beanDefs; } 複製代碼

  在上述的方法中,都經過 registerPostProcessor 中調用 registerBeanDefinition 方法將 definition 放置到 Map當中。能夠看到放到Map中的這個對象都是Spring內部本身定義的。這說明在容器初始化的時候,加載程序員自定義的Bean 的時候,已經有一部分對象被加載到容器中了,經過這些對象來完成後續其餘對象的加載。源碼分析

/**  * 往BeanDefinitionMap中註冊  * @param registry  * @param definition  * @param beanName  * @return 返回一個 BeanDefinitionHolder 對象  */ private static BeanDefinitionHolder registerPostProcessor(  BeanDefinitionRegistry registry, RootBeanDefinition definition, String beanName) {   definition.setRole(BeanDefinition.ROLE_INFRASTRUCTURE);  /**  * 將bean放入Map中  */  registry.registerBeanDefinition(beanName, definition);  // 返回 BeanDefinitionHolder  return new BeanDefinitionHolder(definition, beanName); } 複製代碼

  關於 registerBeanDefinition 後面在Spring Bean 的註冊中會詳細介紹,這裏暫不作介紹。可是這看到有一個 BeanDefinitionHolder 對象。從上述代碼來看 BeanDefinitionHolder 是對 BeanDefinitionbeanName 的封裝。ui

   BeanDefinition 是 Spring 中對 基於註解,或者經過xml方式定義的Bean的封裝。這裏只作概念上的描述,後續會對 BeanDefinition 有一個系統性的認識。this

時序圖

  在上述的時序圖中,提到有一個極其重要的過程,在此過程當中向IoC容器中的beanDefinitionMap中put了 5個Spring內置的對象,這五個對象對應的Spring 的Bean的描述文件爲RootBeanDefinition。lua

  這些類的實現方式都是對Spring後置處理器的應用,關於Spring的擴展點以及擴展點的應用,在之後都會介紹到。 這裏咱們先抓住主要矛盾,容器的初始化。這5個對象在Spring中對應的常量,對應Spring中的類,以及註解。其對應關係以下:url

常量 對應的BeanPostProcessor 對應的註解
CONFIGURATION_ANNOTATION_PROCESSOR_BEAN_NAME ConfigurationClassPostProcessor @Configuration
AUTOWIRED_ANNOTATION_PROCESSOR_BEAN_NAME AutowiredAnnotationBeanPostProcessor @AutoWired
REQUIRED_ANNOTATION_PROCESSOR_BEAN_NAME RequiredAnnotationBeanPostProcessor @Required
COMMON_ANNOTATION_PROCESSOR_BEAN_NAME CommonAnnotationBeanPostProcessor @PostConstruct @PreDestroy
EVENT_LISTENER_PROCESSOR_BEAN_NAME EventListenerMethodProcessor @EventListener
EVENT_LISTENER_FACTORY_BEAN_NAME EventListenerFactory EventListener

  這裏要對ConfigurationClassPostProcessor這個類要足夠的重視,由於該類對應着對註解@Configuration的處理。在這裏要記住 這個類及其的重要,後面會屢次提到這個類。spa

2.容器造成圖

圖1
圖1

  在上一篇文章的最後在類繼承關係的角度,分析了容器初始化圖: 圖2   經過一個new 關鍵字引起的一系列連鎖反應,須要完成如圖二所示圖中對象的初始化。3d

  在圖一中則更爲細節的介紹了這些對象初始化的時候,會作一些什麼事。會對IoC 容器作一些什麼樣的補充。以級容器中對象的變化。

3.總結

  至此,AnnotationConfigApplicationContext(Class<?>... componentClasses)構造方法中對應的this()方法部分已經,所有結束咯...容器對應的也漸漸豐滿了起來。固然,也有不少的問題沒有去解決,本着抓住主要的矛盾的思路,對沒有說明的問題作一個記錄,後續會慢慢補齊:

  • BeanDefinition
  • BeanDefinitionHolder
  • Spring 擴展點值 BeanPostProcessor

本文使用 mdnice 排版

相關文章
相關標籤/搜索