Spring Boot系列之零

Spring Boot插件是如何做到即插即用的

Spring Boot简化了Spring的繁琐配置,让开发同学轻轻松松就可以拉起应用搞事情,同时鉴于Spring教父般的江湖地位,各大开源框架也紧紧团结在Spring Boot周围,推出了各自的自启动插件,那么问题来了:这些插件是如何做到即插即用的呢?

首先我们要告诉Spring Boot先别急着开车,“人在呢!",以优秀且轻量的持久层框架Mybatis为例,与它有关的Spring Boot插件名字叫作mybatis-spring-boot-starter,解压mybatis-spring-boot-starter jar包,拨开最外层的洋葱外衣,在META-INF下可以看到pom.xml文件,这个文件描述了插件依赖的所有jar包,所以它相当于做了一层facade,留给外界一个干净整洁的门面。

pom.xml其中有一个mybatis-spring-boot-autoconfigure依赖,继续在mybatis-spring-boot-autoconfigure jar 包寻找,在META-INF下可以看到spring.factories文件(划重点),文件内容如下: 

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration

典型key=value的格式,左边的key为spring boot启动时加载的众多factory class中的一种,factory class的加载类具体见SpringFactoriesLoader,这里就和Spring Boot启动挂上钩了,而MybatisAutoConfiguration实现的就是实例化sessionfactory bean那一套了,由此得证。

SpringFactoriesLoader加载factory class(factory class为接口类,具体的实现类看spring.factories的配置,有一堆)时的查找路径即为类加载器url下的"META-INF/spring.factories",不同的spring.factories中配置了各式各样的factory class。

EnableAutoConfiguration相关factory class的加载由AutoConfigurationImportSelector类的getCandidateConfigurations方法触发,进一步,AutoConfigurationImportSelector由ConfigurationClassPostProcessor的processConfigBeanDefinitions方法触发,而ConfigurationClassPostProcessor是BeanDefinitionRegistryPostProcessor的子类(BeanDefinitionRegistryPostProcessor又为BeanFactoryPostProcessor的子类,终于找到根了),看到BeanFactoryPostProcessor其触发时机也就比较清楚了(具体可以看下BeanFactoryPostProcessor、BeanPostProcessor,这两种类型的继承类经常被用作扩展程序功能)。

再往前扩展下,启动的时候为什么会调到AutoConfigurationImportSelector,这是因为我们的Spring Boot启动类如Applicaiton.java(也就是含有main方法的启动类)包含注解@SpringBootApplication,而@SpringBootApplication注解是多个注解的合集,其中就包括@EnableAutoConfiguration注解,在启动阶段解析Applicaiton.java类时,注解的解析会处理@EnableAutoConfiguration,而@EnableAutoConfiguration注解import了EnableAutoConfigurationImportSelector.class

@Target({ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Inherited

@AutoConfigurationPackage

@Import({EnableAutoConfigurationImportSelector.class})

public@interfaceEnableAutoConfiguration {

String ENABLED_OVERRIDE_PROPERTY ="spring.boot.enableautoconfiguration";

Class[] exclude()default{};

String[] excludeName()default{};

}

所以,如果我们想自己搞Spring Boot自启动插件开发,要编一个启动类进去,还要配置spring.factories文件,将启动类配置在EnableAutoConfiguration下,由启动类Bean的实例化触发业务相关Bean的初始化或其他逻辑处理。

欢迎关注我的微信公众号

Spring Boot系列之零_第1张图片
68号小喇叭

你可能感兴趣的:(Spring Boot系列之零)