SpringBoot自动配置原理
自动配置原理:
-
SpringBoot启动的时候加载主配置类(项目名Application),
开启了自动配置功能(@SpringBootApplication中的)@EnableAutoConfiguration
-
@EnableAutoConfiguration的作用:
- 利用EnableAutoConfigurationImportSelector给容器中导入一些组件?
- 进入到AutoConfigurationImportSelector.class内部
通过 红框内的代码(如下),获取候选的配置
List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
- 进入**getCandidateConfigurations(annotationMetadata, attributes)**方法
- 进入loadFactoryNames ,后找到
因此**SpringFactoriesLoader.loadFactoryNames()**的作用是:扫描所有的jar包类路径下
META-INF/spring.factories,把扫描到的这些文件的内容包装成properties对象,
从properties中获取到EnableAutoConfiguration.class类(类名)对应的值,然后把他们添加在容器中。
即将类路径下 META-INF/spring.factories里面配置的所有EnableAutoConfiguration.class的值加入到了容器中。
每一个这样的xxxAutoConfiguration类都是容器中的一个组件,都加入到容器中;用他们来做自动配置
-
每一个自动配置类进行自动配置功能;
-
以HttpEncodingAutoConfiguration为例解释自动配置原理
**HttpEncodingAutoConfiguration(Http编码自动配置)**类上注解
@Configuration( // 表示这是一个配置类,以前编写的配置文件一样,也可以给容器中添加组件
proxyBeanMethods = false
)
@EnableConfigurationProperties({ServerProperties.class}) //启动ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties绑定起来;
@ConditionalOnWebApplication( //Spring底层@Condition注解,根据不同的条件,如果满足指定的条件,整个配置类里面的配置就会生效; 判断当前应用是否是web应用,如果是,则生效;如果不是,则不生效
type = Type.SERVLET
)
@ConditionalOnClass({CharacterEncodingFilter.class}) //判断当前项目有没有这个类
// CharacterEncodingFilter: SpringMVC中进行乱码解决的过滤器;
@ConditionalOnProperty( //判断配置文件中是否存在某个配置 server.servlet.encoding;如果不存在,判断也是成立的(即使我们配置文件中不配置server.servlet.encoding,也默认生效)
prefix = "server.servlet.encoding",
value = {"enabled"},
matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
根据当前不同的条件判断,决定这个配置类是否生效,一旦这个配置类生效;这个配置类就会给容器中添加各种组件;这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和配置文件绑定的;
- 所有在配置文件中能配置的属性都是在xxxx.properties类中封装着;配置文件能配置什么就可以参照某个功能对应的这个属性类
ServerProperties.class
@ConfigurationProperties( // 从配置文件中获取指定的值和bean的属性进行绑定
prefix = "server",
ignoreUnknownFields = true
)
public class ServerProperties {
附上雷丰阳(雷神的总结)
个人感觉,雷神版源码偏老,现在的源码经过更改完善,已经产生了一些变化。
因此对于springboot的思想学习,这仅仅只是一个开始。
一旦一种新技术开始滚动碾压道路,如果你不能成为压路机的一部分,那么你就只能成为道路的一部分。