Springboot自动配置生效原理分析

本文深入探讨Springboot启动原理,解析自动配置类如何生效,依赖于@Conditional注解及YML配置。通过实例分析HttpEncodingAutoConfiguration,揭示自动配置为容器添加组件的过程。了解自动配置精髓,包括Springboot加载大量自动配置类,根据引入jar包决定是否需要手动配置,以及通过properties或yml文件设定属性值。

目录

自动配置类是怎么生效的

自动配置原理举例分析

自动配置的精髓


 

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文件设置属性值和获取方法

 

 

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值