Spring註解配置分析(一)——從啓動到加載配置類

Spring是一個IOC容器,只要配置了bean之後在程序的其他地方可以自動注入實例,現在使用最多是註解配置,那麼配置的那些 @Configuration、@EnableAutoConfiguration等註解是如何工作的呢?

  1. Spring是通過BeanFactory保存Bean的配置,那麼BeanFactory如何創建?
    1. SpringApplication啓動時在其run方法中會創建一個ApplicationContext的子類,以Servlet項目爲例,會創建AnnotationConfigServletWebServerApplicationContext實例。
    2. 在創建AnnotationConfigServletWebServerApplicationContext實例時會通過父類GenericApplicationContext創建一個DefaultListableBeanFactory,這時的bean factory沒有什麼作用,後面會對這個bean factory進行修改。
  2. 如何發現有註解的類以及如何處理各種註解?
    1. 既然配置了註解,那麼一定需要註解處理器來處理這些註解,所有首先加載的類應該是註解處理器。上面一個問題中已經知道會初始化一個AnnotationConfigServletWebServerApplicationContext 實例,它有兩個重要屬性 AnnotatedBeanDefinitionReader 和 ClassPathBeanDefinitionScanner。 AnnotatedBeanDefinitionReader 初始化時會通過 AnnotationConfigUtils 注入6個註解處理器,其中就包括處理 @Configuration 註解的 ConfigurationClassPostProcessor 。
    2. 註解處理器加載完成之後,就需要加載被註解的類。首先被加載的類是啓動類,也就是通過run方法的參數傳入的類型。通過 SpringApplication 的 prepareContext 方法將啓動類添加到 bean factory 中。
    3. 經過前面兩步 bean factory 中已經包含了註解處理器和帶註解的啓動類,在 AbstractApplicationContext 的 refresh 的過程中最終會調用 PostProcessorRegistrationDelegate 的 invokeBeanFactoryPostProcessors 方法,調用 BeanFactoryPostProcessor 的實現類(這裏會循環調用,解析註解過程中產生的 BeanFactoryPostProcessor)。 ConfigurationClassPostProcessor 實現了 BeanDefinitionRegistryPostProcessor 間接實現了 BeanFactoryPostProcessor 接口,所以從調用 ConfigurationClassPostProcessor 開始,Bean 的註冊工作就正式啓動了。
  3. 前面的問題中只加載了啓動類,其他有註解的類如何加載?

    首先可以肯定第一個處理的一定是啓動類,在處理啓動類的過程中,會解析啓動類上的註解,這些註解通常都是用來聲明需要加載哪些其他的類。例如 @ComponentScan 聲明瞭需要加載的包, @Import 聲明需要加載的一個或一組類。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章