start出现历史:
SpringBoot的相对于SpringMVC的出现初衷就是无须繁琐的配置文件就可以轻松使用自己需要的功能, 我们都知道SpringBoot你只需要引入对应的XXX-spring-boot-start. 然后写上我们的配置属性文件就可以直接使用对应的增强功能。
众所周知我们都知道直接引入Start和配置相关properties文件就可以使用我们的功能,那么springBoot底层又是如何集成解决自动配置的呢~
springBoot-start原理:
@SpringBootApplication 点击进去查看源码。
@EnableAutoConfiguration这个注解,我们从英文字面上理解就是开启自动配置, 我们再点击这个注解进入源码分析
进来后我们可以看到一个@Import的class 我们点击进入查看相关源码。
我们可以看到一个重要的方法 selectImports方法,我们阅读代码查看到调了this.getAutoConfigurationEntry(autoConfigurationMetadata, annotationMetadata);
这个方法. 再跟踪getAutoConfigurationEntry源码
我们可以看到它调用了 getCandidateConfiguration这个方法,顾名思义就是根据调解导入相关的自动配置。这里我们就大概明白了,为什么只有引入了依赖才会使用对应的start功能。
点击this.getCandidateConfigurations方法查看实现
我们看到它的底层调用了 SpringFactorysLoader.loadFactoryNames()这个方法。
再次点击进去查看源码
看到关键的一句话,就是
classLoader.getResources("META-INF/spring.factories"),这里我们就明白为什么我们手写一个Start要在META-INF 下新建一个spring.factories的文件了,因为它启动的时候会去读取这个配置文件。
这里小编也遇到了一个面试题,首页问我如何写一个start。我答上来了,可是说到为什么要写一个这样的文件,我也知道它启动会去加载,但是没仔细看源码就回答的不是很好。特意记录一下
至此我们就大概说完了启动加载过程,我们再看如何读取这些配置文件的
我们可以看到springBoot自带了 spring-boot-autoconfigure这个依赖包,正是这个包自动帮助我们来处理的,
查看spring的启动配置 它有自己的spring.factories 我们可以看到 它有个
Auto Configure 的注解地方, 有一段配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=
至此我们应该明白 我们为什么也要在 spring.factories中写一个这样的属性指向我们对应的XXX-AutoConfiguration
我们再看看springBoot默认自己有的AutoConfiguration
还有JMS等等 如下图
我们可以看到ActiveMQAutoConfiguration 对应再配置文件有指定对应的路径,我们点这个配置类 ActiveMQAutoConfiguration
我们就可以看到它是如何读取我们的activeMQ属性文件中的值的。我们查看ActiveMQProperties这个类
看到此次我们似乎就明白了,只需要引入Start和配置相关的配置文件,SpringBoot就能帮助我们自动注入对应的bean提供我们直接使用了
总结:
如果手写Start我们就可以分为大致三步了
1.新建META-INF/spring.factories的文件 里面的XXX-AutoConfig指向我们的AutoConfig
2.新建XXX-AutoConfig 在文件中实例化我们需要的Bean交给Spring管理
3.新建属性文件 properties
编码不易,你们的关注是我永远坚持的动力, 感谢再看或分享的小伙伴们.
学习交流群