一:ConfigurationClassPostProcessor類的埋點
自動配置解析的核心功能都在這個類里面,這是一個BeanDefinitionRegistryPostProcessor的實現類,首先需要注冊BeanDefinition,
然后實例化對象,最后調用,我們來循序漸進的跟進一下
1:注冊ConfigurationClassPostProcessor的BeanDefinition對象
實例化這個類對調用到類的無參數構造方法:
無參數構造方法:
2:注冊啟動類的配置文件 ,TestSpringbootApplication
創建並注冊BeanDefinition對象:
3:實例化ConfigurationClassPostProcessor對象並且調用
因為是BeanDefinitionRegistryPostProcessor接口的實現類,所以會在這個 方法實例化並調用哦
調用到類ConfigurationClassPostProcessor類中
二:自動配置整體流程分析
1:如果沒有任何配置
2:加上@Configuration注解
會發現所有的解析動作都會空跑一遍
3:加上ComponentScan注解
進入解析:parse
這種解析的方法doProcessConfigurationClass:
解析ComponentScan組件:
這樣@ComponentScan組件就解析完成了
4:加上@Import注解
注冊Import,registerImport,注冊后處理processConfigurationClass,遞歸處理Configuration注解的類
到這里Import類的解析完畢,包括遞歸解析
我們來簡單的看一下自動配置如何解析
從這里開始:
獲取Import注解:
搜集Import:
注冊registrar對象:
注冊deferImportSelector對象:
注冊並且搜集Import信息邏輯:
這里又回到了最開始埋點時候的加載流程,會把所有的EnableAutoConfiguration 的key對應的values值返回
返回之后開始處理Configuration的邏輯
進入解析configuration注解的遞歸方法:
到這里在spring.factories中配置項都解析完成,而且會解析每一個EnableAutoConfiguration的values項,實現注冊beanDefinition。
以JmxAutoConfiguration為例,分析一下注冊流程
解析到configuration類中有@Bean注解,需要搜集@Bean方法信息,緩存到configClass中
解析配置類:
當spring容器啟動的時候,會解析deferImportSelector,加載所有的spring.factories文件中的配置,過濾
遞歸解析configuration配置
總結:
自動配置的實現就是spring啟動的時候,加載spring.factories的配置,解析每一個Configuration類,根據condition加載自動配置類,
根據condition條件實例化bean對象,然后維護到spring容器中。