SpringBoot的自动加载举例。
使用HttpEncodingAutoConfiguration举例
我们从/Users/apple/Documents/Work/.m2/repository/org/springframework/boot/spring-boot-autoconfigure/2.1.9.RELEASE/spring-boot-autoconfigure-2.1.9.RELEASE.jar!/META-INF/spring.factories文件中的HttpEncodingAutoConfiguration开始分析。
/**
* @Configuration注解的作用有2个。
* 1、表明这是一个配置类
* 2、可以给容器中添加组件,类似@Service等Ioc注解的作用
* 这里表明这个类是一个配置类,而且吧配置类注入到Spring容器中
*/
@Configuration
/**
* @EnableConfigurationProperties注解的作用
* 1、启用ConfigurationProperties功能。具体到这里就是启用HttpProperties
* 2、吧HttpProperties.class也注入到了Spring的容器中(实现了JavaBean与yaml配置文件属性的关联)
*/
@EnableConfigurationProperties(HttpProperties.class)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
/**
* @ConditionOnXxx类注解的作用
* 1、均表示根据一定的条件来决定是否注入到Spring容器中,这些Condition是前提,只有这些满足,才会创建HttpEncodingAutoConfiguration。
*/
@ConditionalOnClass(CharacterEncodingFilter.class)
@ConditionalOnProperty(prefix = "spring.http.encoding", value = "enabled", matchIfMissing = true)
public class HttpEncodingAutoConfiguration {
HttpProperties是否会被Spring创建,取决于有没有@EnableConfigurationProperties来关联启用它。
/**
* @ConfigurationProperties注解的作用
* 1、用来进行属性绑定的。
* 这里是:HttpProperties类的属性就被绑定到了以spring.http开头的配置文件中(如yaml文件)
* 备注:
* 这个类是否会被注入到Spring容器中,取决与有没有@EnableConfigurationProperties来让它启用。
*/
@ConfigurationProperties(prefix = "spring.http")
public class HttpProperties {
以上的分析解决了HttpProperties最终会根据一定的条件是否创建的过程,但是并没有解决yaml文件配置的属性是怎么注入到了HttpProperties的问题。以下分析一下这个问题。
yaml文件与配置类HttpProperties的关联是通过@ConfigurationProperties注解的prefix来绑定的。看下图
@ConfigurationProperties(prefix = "acme", ignoreUnknownFields = true)
@Data
public class AcmeProperties {
private String username;
}
//application.yaml文件
acme:
username: yuchangyuan
可以看到配置类的prefix="acme"与application.yaml的acme关联起来了,配置类的属性(这里是username)与yaml文件的username关联起来了。这里只是拿String类型的username属性举了例子,其他如List、Map、对象等都可以与yaml文件文件关联。具体可以参看下yaml的一些简单描述:
https://www.runoob.com/w3cnote/yaml-intro.html