目录
Springboot的启动原理
https://blog.youkuaiyun.com/Delicious_Life/article/details/105972637
自动配置类是怎么生效的
依赖于Configuration类中的@Conditional注解,注解指定的条件成立时,才会给容器中添加组件,yml文件中的配置才会生效。

我们如何知道哪些配置类生效了?在yml文件中写上debug=true属性,来让控制台打印自动配置报告,控制台会显示对应信息
自动配置原理举例分析
以HttpEncodingAutoConfiguration类(Http编码自动配置)为例解释自动配置原理;
//表示这是一个配置类,和以前编写的配置文件一样,也可以给容器中添加组件;
@Configuration
//启动指定类的ConfigurationProperties功能;
//进入这个HttpProperties查看,将配置文件中对应的值和HttpProperties绑定起来;
//并把HttpProperties加入到ioc容器中
@EnableConfigurationProperties({HttpProperties.class})
//Spring底层@Conditional注解
//根据不同的条件判断,如果满足指定的条件,整个配置类里面的配置就会生效;
//这里的意思就是判断当前应用是否是web应用,如果是,当前配置类生效
@ConditionalOnWebApplication(
type = Type.SERVLET
)
//判断当前项目有没有这个类CharacterEncodingFilter;SpringMVC中进行乱码解决的过滤器;
@ConditionalOnClass({CharacterEncodingFilter.class})
//判断配置文件中是否存在某个配置:spring.http.encoding.enabled;
//如果不存在,判断也是成立的
//即使我们配置文件中不配置pring.http.encoding.enabled=true,也是默认生效的;
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
//他已经和SpringBoot的配置文件映射了
private final Encoding properties;
//只有一个有参构造器的情况下,参数的值就会从容器中拿
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
//给容器中添加一个组件,这个组件的某些值需要从properties中获取
@Bean
@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;
}
//。。。。。。。
}
总结:一旦这个配置类生效,配置类就会给容器中添加各种组件,这些组件的属性是从对应的properties类中获取的,这些类里面的每一个属性又是和yml文件绑定的,所有在yml文件中能配置的属性都是在XXXProperties类中封装着的,yml文件能配置能配置的参数来源于对应的properties属性类
//从配置文件中获取指定的值和bean的属性进行绑定
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
// .....
}
在yml文件中点出来的东西和Properties对应如下

自动配置的精髓
1.Springboot启动会加载大量的自动配置类
2.我们要先确认pom文件中引入的jar包有没有在springboot默认提供的自动配置类
3.有的话就不需要你配置对应的组件,没有的话需要手动配置组件,因为jar包只是个启动器
4.给容器中自动配置类添加组件时会从properties类中获取某些属性,我们只需要在yml配置文件中指定属性值即可
xxxxAutoConfigurartion负责把自动配置类添加到容器中,xxxxProperties封装了自动配置类的固有属性和方法,我们可以通过yml文件或properties文件设置属性值和获取方法
本文深入探讨Springboot启动原理,解析自动配置类如何生效,依赖于@Conditional注解及YML配置。通过实例分析HttpEncodingAutoConfiguration,揭示自动配置为容器添加组件的过程。了解自动配置精髓,包括Springboot加载大量自动配置类,根据引入jar包决定是否需要手动配置,以及通过properties或yml文件设定属性值。
2125

被折叠的 条评论
为什么被折叠?



