spring boot 的自动加载机制
视频的第20集仔细的和我们讲了spring boot开启时是如何加载组件的。速度有些快,我是看来四遍才懂的。
接下来先讲下大概。
-
spring boot在启动时会加载大量形如xxxAutoConfiguration即自动配置类。具体那些类会被加载取决于配置文件中是否有相应的配置。
-
这些类是如何根据配置决定是否加载的呢,加载做了什么事?
我们那HttpEncodingAutoConfiguration类作为例子讲解,看其部分源码:
// 注解其为配置类,当此类被加载,就会将某些组件添加进spring容器中。
@Configuration
// 如果此类被加载,激活xxxProperties类与配置文件的绑定,
// 在spring boot中,配置文件中的每一项都有与之对应的properties类的属性。
// 自动配置类也会使用该类中的属性值来生成组件。
@EnableConfigurationProperties({HttpProperties.class})
// 以下三个@ConditionalXxx就是判断是否加载此类的属性
// 判断是否为web应用,如果其为web应用且classpath中存在CharacterEncodingFilter.class
// 而且还有spring.http.encoding属性配置了且值为enable(matchIfMissing则表示没有也没关系,
// 默认值为true),则就加载。
@ConditionalOnWebApplication(
type = Type.SERVLET
)
// 比如需要有Aspect类,但没有导入相关依赖,classpath中没有该类,就不加载
@ConditionalOnClass({CharacterEncodingFilter.class})
@ConditionalOnProperty(
prefix = "spring.http.encoding",
value = {"enabled"},
matchIfMissing = true
)
public class HttpEncodingAutoConfiguration {
private final Encoding properties;
public HttpEncodingAutoConfiguration(HttpProperties properties) {
this.properties = properties.getEncoding();
}
// 添加组件到容器中
@Bean
// 如果spring容器中没有这个bean对象的话(conditional扩展注解还有很多!)
@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;
}
//...
}
注意,我们可以通过设置 debug=true 来控制程序将自动配置报告打印在控制台中,方便我们查看!
实现自动加载功能的类都存在于spring-boot-starter依赖所依赖的spring-boot-autoconfiguration中。
网友评论