以Mybatis為例,淺談springBoot的starter自動裝載原理與實現

以Mybatis為例,淺談springBoot的starter自動裝載原理與實現

定製自己的springBoot的starter步驟

1.編寫一個帶有@Configuration註解的類,如果按條件加載可以加上@ConditionalOnClass或@ConditionalOnBean註解

2.在classpath下創建META-INF/spring.factories文件,並在spring.factories中添加

org.springframework.boot.autoconfigure.EnableAutoConfiguretion =\
上面定義類的全類名

自動裝載的配置的原理

1.SpringApplication註冊
ConfigurationClassPostProcessor用於解析配置類,下面為註冊的主要過程:

  1. SpringApplication在run方法中調用 createApplicationContext()來創建 AnnotationConfigEmbeddedWebApplicationContext
  2. 在初始化AnnotationConfigEmbeddedWebApplicationContext時會一併創建 AnnotatedBeanDefinitionReader這個類
  3. 在初始化AnnotatedBeanDefinitionReader時會調用 AnnotationConfigUtils.registerAnnotationConfigProcessors(this.registry);來初始化ConfigurationClassPostProcessor

AnnotationConfigUtils註冊
ConfigurationClassPostProcessor的
registerAnnotationConfigProcessors方法部分代碼示例

以Mybatis為例,淺談springBoot的starter自動裝載原理與實現

註冊
ConfigurationClassPostProcessor類的時序圖

以Mybatis為例,淺談springBoot的starter自動裝載原理與實現

2.加載解析META-INF/spring.factories下的類為 BeanDefinition的時序圖

以Mybatis為例,淺談springBoot的starter自動裝載原理與實現

加載功能的實現主要得益於
ConfigurationClassPostProcessor 是實現了
BeanDefinitionRegistryPostProcessor,所以在
AbstractApplicationContext中調用
postProcessBeanDefinitionRegistry時會調用到
ConfigurationClassPostProcessor,從在在這裡開始對META-INF/spring.factories配置的類的進行解析並將它們變為BeanDefinition對象

加載META-INF/spring.factories的主要代碼

以Mybatis為例,淺談springBoot的starter自動裝載原理與實現

Mybatis的starter自動裝配實現

1.編寫一個帶有@Configuration註解的類

以Mybatis為例,淺談springBoot的starter自動裝載原理與實現

Mybatis部分代碼展示

2.在classpath下創建META-INF/spring.factories文件

 # Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

最後展示一下mybatis的結構圖

以Mybatis為例,淺談springBoot的starter自動裝載原理與實現


分享到:


相關文章: