SpringBoot自动配置原理

一.首先在spring-boot的jar包下的MATA-INF中有个spring.factory文件,在这个文件里面存放了各种配置类(Auto Configure)的名称

主程序@SpringBootApplication中@EnableAutoConfiguration里面的
@Import({AutoConfigurationImportSelector.class})会加载AutoConfigurationImportSelector类, 并使用selectImports方法获取spring.factory里所有配置类的名称,生成一个properties对象, 然后根据名称将这些配置类加载进来,配置类里面有很多@Bean注解用来加载组件,当配置类加载进来后会把这些组件进行加载,并通过@ConditionalOn注解来判断是否加载这个组件

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
public @interface SpringBootApplication {

}


二.配置类是如何进行自动配置的,属性从哪里来

比如:HttpEncodingAutoConfiguration这个配置类,头上有@EnableConfigurationProperties({HttpProperties.class}),EnableConfigurationProperties也就是启用HttpProperties这个类(属性类),让他进行属性绑定,并把这个类加入到IOC容器中。

构造方法:

@EnableConfigurationProperties(HttpProperties.class)
public class HttpEncodingAutoConfiguration{
            private final Encoding properties;
  public HttpEncodingAutoConfiguration(HttpProperties properties) {
           this.properties = properties.getEncoding();
             }  
            }

将HttpProperties类里面的Encoding属性赋值给HttpEncodingAutoConfiguration的成员变量 Encoding properties;


三.HttpProperties是如何和我们的主配置文件application.properties进行绑定的(获取值的)

在这个类的头上有个@ConfigurationProperties(prefix = “spring.http”)注解,他会把我们在配置文件中填写的spring.http开头的属性赋值给本类中有2个成员变量:
如:

private boolean logRequestDetails;
private final HttpProperties.Encoding encoding = new HttpProperties.Encoding

可以通过配置文件
spring.http.log-request-details=false
spring.http.encoding.(charset.force…)= 进行赋值;
这些成员变量能赋什么值,比如logRequestDetails是boolean类型所以能true or false;
Encoding 是这样,在HttpProperties属性类里面有个内部类Encoding,encoding的属性就取决于这个。

public static class Encoding {
      public static final Charset DEFAULT_CHARSET;
         private Charset charset;
         private Boolean force;
         private Boolean forceRequest;
         private Boolean forceResponse;
         private Map<Locale, Charset> mapping;


所以大致的思路是这样的:

1. 主程序@SpringBootApplication里@EnableAutoConfiguration的@Import({AutoConfigurationImportSelector.class})会扫描jar包中的spring.factory然后把里面的自动配置类加载进来,自动配置类就会把他的那些组件进行加载放入IOC容器。

2. 自动配置类的属性通过构造方法 private final Encoding properties; 从@EnableConfigurationProperties({HttpProperties.class})里面的属性类获取

3. 属性类HttpPropertie则是通过@ConfigurationProperties(prefix = “spring.http”)注解将配置文件中配置的键值对进行绑定,如: spring.http.log-request-details=false
spring.http.encoding.charset=utf-8, 将false和utf-8
分别赋值给HttpPropertie里面的2个成员变量logRequestDetails和Encoding.charset

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值