SpringBoot自动配置原理及自定义启动器依赖

Springboot的出现为基于Spring的企业级开发带来了极大的便利,引入相关的依赖无需做多余的配置即可使用其功能,这便依赖于其自动配置的特性。下面追踪源码理解深入理解Springboot自动配置原理。

Springboot的自动配置属性依赖于注解@EnableAutoConfiguration(@SpringBootApplication组合注解之一):
SpringBoot自动配置原理及自定义启动器依赖_第1张图片
该注解的定义中,除了元注解还剩下@AutoConfigurationPackage@Import,前者根据字面意思可以知道它主要基于package实现自动配置;@Import注解是Spring提供的用来注册Bean的注解,其用法可以参考@Import注解的使用一文,下面就这两个注解深入理解Springboot自动配置的原理。

(1)@AutoConfigurationPackage
SpringBoot自动配置原理及自定义启动器依赖_第2张图片
@AutoConfigurationPackage注解的定义可以看到该注解也是利用@Import注解注册了Registry
SpringBoot自动配置原理及自定义启动器依赖_第3张图片
该类实现了ImportBeanDefinitionRegistrar接口实现注入,在registerBeanDefinitions方法中调用AutoConfigurationPackagesregistry方法实现了基于package注入Bean的逻辑,该方法接受两个参数:第一个参数是bean注册器,另一个参数是一个包名,该参数二的获取方法实现如下:
在这里插入图片描述
可以看到,根据注解的元信息获取到了进行自动配置的包名,因为该注解是加在启动类上的,所以此处获取到的就是启动类所在的包名,这也是为什么与启动类在同一级或者在其所在包子包下的bean可以实现自动注入的原因。registry方法中的逻辑此处就不再阐述了,无非就是将该包及其子包下的加了某些特定注解(如:@Service、@Controller等)的bean加载到容器中,感兴趣的同学可以自己去打断点追踪一下。

(2)@Import({AutoConfigurationImportSelector.class})
该注解导入了AutoConfigurationImportSelector类,该类实现了DeferredImportSelector接口,从而继承实现了ImportSelector接口,借助selectImports方法实现bean注入。

  • 首先获取需要自动配置的实体:
    在这里插入图片描述
    SpringBoot自动配置原理及自定义启动器依赖_第4张图片
  • 利用SpringFactoriesLoaderloadFactoryNames()方法加载工厂bean,该方法的第一个参数接受工厂类类型,源码中已经固定为EnableAutoConfiguration.class;参数二是配置注解属性集合;

在这里插入图片描述
在这里插入图片描述
loadFactoryNames()方法的实现中我们可以看到它首先从类路径下的"META-INF/spring.factories"文件中读取所有的配置项,
SpringBoot自动配置原理及自定义启动器依赖_第5张图片然后过滤获取以工厂类名(即EnableAutoConfiguration.class的全限定性名称)为key的配置项。
SpringBoot自动配置原理及自定义启动器依赖_第6张图片

总结:Springboot实现自动配置的原理都是借助@Import注解,首先自动加载所有与启动类在同一包及其子包下的所有bean;然后通过SpringFactoriesLoader类加载所有类路径下META-INF/spring.factories文件中以org.springframework.boot.autoconfigure.EnableAutoConfiguration为键的所有配置项。

理解了Springboot的自动配置原理,我们可以很容易的结合条件注解自定义一个启动类依赖:

新建一个maven启动器依赖项目,包内容很简单:定义了一个普通类,并通过Java Config的方式结合条件注解注入上下文,注入条件是存在test.car的配置项:
SpringBoot自动配置原理及自定义启动器依赖_第7张图片
在这里插入图片描述
在resources目录下新建如下文件,

在这里插入图片描述
文件内容如下:
在这里插入图片描述
将该项目打成jar包上传本地仓库:
在这里插入图片描述

注:官方建议将启动依赖项目的artifactId设置为: *-spring-boot-starter 的形式。

在另一个springboot项目中引入:
在这里插入图片描述
测试如下:
SpringBoot自动配置原理及自定义启动器依赖_第8张图片
当在配置文件中配置了 test.car=true时,控制台中正常打印出了i am a car的字样;
当配置文件中未配置或者值为false时,控制台报除了carbean不存在的异常。

你可能感兴趣的:(SpringBoot自动配置原理及自定义启动器依赖)