SpringBoot(7) 自动配置原理
大家有没有想过,SpringBoot的配置文件到底能写什么?如何写?懂自动配置原理就懂能写什么!
一,自动配置原理
1),SpringBoot启动的时候加载主配置类,由 @EnableAutoConfiguration开启了自动配置功能。2),@EnableAutoConfiguration 作用。
- 利用 AutoConfigurationImportSelector 给容器中导入一些组件
- List configurations = this.getCandidateConfigurations(annotationMetadata, attributes); 获取候选的配置
SpringFactoriesLoader.loadFactoryNames() 的作用
1,扫描所有 jar 包类路径下 META-INF/spring.factories
2,把扫描到的这些文件的内容包装成properties对象
3,从properties 中获取到 EnableAutoConfiguration.class 类名 对应的值,然后把他们添加在容器中。
将类路径下 META-INF/spring.factories 里面配置的所有EnableAutoConfiguration的值加入到了容器中;
每一个这样的类 *** AutoConfiguration 类都是容器中的一个组件,都加入到容器中,用它们来做配置;
@Configuration( proxyBeanMethods = false ) //表示这是一个配置类,以前编写的配置文件一样,也可以给容器添加组件。 @EnableConfigurationProperties({HttpProperties.class}) //启动指定类ConfigurationProperties功能;将配置文件中对应的值和HttpEncodingProperties 绑定起来;并把 HttpEncodingProperties 加到ioc容器中。 @ConditionalOnWebApplication( type = Type.SERVLET )//Spring 的底层注解@Conditional注解(Spring注解版),根据不同条件,如果满足指定条件,整个配置类里面的配置就会生效;判断当前应用是否为web应用,如果是,该配置类生效。 @ConditionalOnClass({CharacterEncodingFilter.class}) //判断当前项目有没有 CharacterEncodingFilter 这个类。 @ConditionalOnProperty( prefix = "spring.http.encoding", value = {"enabled"}, matchIfMissing = true ) //判断配置文件中是否有某个配置,spring.http.encoding.enabled 如果有,判断也成立. //即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的; public class HttpEncodingAutoConfiguration { //他已经和SpringBoot的配置文件映射了 private final HttpEncodingProperties properties; //只有一个有参构造器的情况下,参数的值就会从容器中拿 public HttpEncodingAutoConfiguration(HttpProperties properties) { this.properties = properties.getEncoding(); } @Bean //给容器中添加一个组件,这个组件的某些值需要从properties中获取 @ConditionalOnMissingBean //判断容器没有这个组件,成立则执行该方法 public CharacterEncodingFilter characterEncodingFilter() { CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter(); filter.setEncoding(this.properties.getCharset().name()); filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.REQUEST)); filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.autoconfigure.http.HttpProperties.Encoding.Type.RESPONSE)); return filter; }
从上面看注解可以看出,根据 @Conditional 扩展注解来判断不同条件,决定这个配置类是否生效。
该配置类一旦生效,就会给容器中添加各种组件,这些组件的属性值是从对应的properties 类中获取的,这些类里面的每一个属性又是和我们的配置文件绑定的。
5),所有的配置文件都在 xxxProperties类中封装着,配置文件能配置什么就可以参照某个功能对应的这个属性类。@ConfigurationProperties( prefix = "spring.http" //从配置文件中获取指定的值和bean的属性进行绑定 ) public class HttpProperties {
xxxxAutoConfigurartion:自动配置类;(给容器中添加组件)
xxxxProperties:封装配置文件中相关属性;
总结:
1),SpringBoot 启动会加载大量的自动配置类
2),我们看业务需要的功能在不在SpringBoot默认写好的自动配置类
3),再看这个自动配置类中到底配置了哪些组件;(我们要的组件有,就不需要再来配置)
4),给容器中自动配置类添加组件的时候,会从properties类中获取某些属性。我们就可以在配置文件中指定这些属性的值。
- SpringBoot学习笔记(3) Spring Boot 运行原理,自动配置
- SpringBoot(4)—自动配置原理
- SpringBoot自动配置原理
- Spring Boot 自动配置原理再探
- SpringBoot学习之自动配置原理
- SpringBoot--关于配置(配置文件加载位置,外部配置,自动配置原理)
- Spring Boot 运行原理 - 查看Spring Boot自动配置项
- spring boot自动配置原理
- SpringBoot系列教程12--pringBoot自动配置原理探析
- SpringBoot学习笔记(三) SpringBoot 自动配置原理
- SpringBoot学习笔记(3) Spring Boot 运行原理,自动配置
- Spring Boot之自动配置的原理
- Spring Boot自动配置原理
- 三、SpringBoot——自动配置原理
- SpringBoot核心原理之自动配置AutoConfiguration
- Spring boot运行原理-自定义自动配置类
- Spring Boot之自动配置原理以及自定义starter
- SpringBoot学习笔记(一)SpringBoot2 自动配置原理
- Spring Boot核心原理-自动配置
- SpringBoot自动配置原理-学习