一.首先在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