您的位置:首页 > 编程语言 > Java开发

SpringBoot(7) 自动配置原理

2020-06-03 05:42 513 查看

大家有没有想过,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 类都是容器中的一个组件,都加入到容器中,用它们来做配置;

3),每一个自动配置类进行自动配置功能 4),以简单的 HttpEncodingAutoConfiguration 为栗解释自动配置原理;
@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类中获取某些属性。我们就可以在配置文件中指定这些属性的值。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: