1. 加载过程

step1: @SpringBootApplication @ConfigurationProperties(prefix =”application.properties” )
step2: @EnableAutoConfiguration
利用 EnableAutoConfigurationImportSelector 来给容器导入一些组件
List configurations = this.getCandidateConfigurations(annotationMetadata, attributes);
SpringFactoryloader.loadFactoryName( ): 从(每个externallib中)META-INF/spring.factories获取配置文件 eg: xxxAutoConfiguration (内容: org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,)
image.png
解析:
@Configuration(proxyBeanMethods = false)——》表明这是个配置类
@EnableConfigurationProperties({ServerProperties.class}) ——-》启动指定类的configurationProperties的功能,即从配置文件中获取指定的值和bean的属性进行绑定。 所有的配置文件中能配置的属性都是在xxxProperties.class类中封装着,配置文件能配置什么,可以参照此功能对应的属性类。 将配置文件中的值和类中的属性进行绑定(即实例化赋值)。
@ConditionalOnWebApplication(type = Type.SERVLET)—-》判断当前运用是不是web运用。这是spring底层的@conditional注解,如果满足条件,整个配置类中的配置才会生效。
@ConditionalOnClass({CharacterEncodingFilter.class})——》 判断当前项目有没有这个类CharacterEncodingFilter,是springMVC中的乱码过滤器
@ConditionalOnProperty(
prefix = “server.servlet.encoding”,
value = {“enabled”},
matchIfMissing = true
)——》 判断配置文件中是否存在某个配置. 本例中表示: 即使server.servlet.encoding中不配置value = {“enabled”}, 该配置文件也是生效的
———————————————————————————————————————————————————————-
public class HttpEncodingAutoConfiguration {
private final Encoding properties**;


// @EnableConfigurationProperties({ServerProperties.class}) 把容器和配置文件绑定起来,并把Encoding properties加入到IOC容器中** public HttpEncodingAutoConfiguration(ServerProperties properties) {
this.properties = properties.getServlet().getEncoding()
;
**}

  1. @Bean // 给容器中添加一个组件,这个组件的某些值需要从properties中获取<br /> @ConditionalOnMissingBean<br /> public CharacterEncodingFilter characterEncodingFilter() {<br /> CharacterEncodingFilter filter = new OrderedCharacterEncodingFilter()**;<br /> **filter.setEncoding(this.properties.getCharset().name())**; // 获取编码的名字,utf-8? gbk?<br /> **filter.setForceRequestEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.REQUEST))**;<br /> **filter.setForceResponseEncoding(this.properties.shouldForce(org.springframework.boot.web.servlet.server.Encoding.Type.RESPONSE))**;<br /> **return filter**;<br /> **} |

| step3: springboot 的精髓:
1)springboot启动会加载大量的自动配置类;
2) 看我们需要的功能有没有spring boot默认写好的自动配置类;
3) 再看这个自动配置类中到底配置了哪些组件;只要我们要用的组件,就不需要再来配置了,如果没有,则需要自己写配置类;
4) 给容器中自动配置类添加组件的时候,会从properties类中获取某些属性,我们就可以在配置文件中指定这些属性的值;

xxxAutoConfiguration类: 自动配置类
给容器总添加组件 xxxProperties:封装配置文件中相关属性 | | step4: conditional的扩展类,进行条件判断 | | step5: 在application.properties中配置: debug=true 进行debug模式开启 |

2. 测试类

@ExtendWith(SpringExtension.class)