以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自动装载原理与实现


分享到:


相關文章: