目录
ImportSelector和DeferredImportSelector
问题
- springboot整合Tomcat流程, 以及解析tomcat配置
- @EnableAutoConfiguration做的事情
- springboot解析spring.factory自动配置类
- springboot解析条件注解
- start机制原理
=========================================
创建启动Tomcat流程
解析Tomcat配置项
配置文件ServerProperties, 包含server.port和server.threads等
解析自动配置流程
@EnableAutoConfiguration
开启自动解析配置类
- 根据 classpath 下的依赖自动配置
- 条件注解自动配置
- 配置文件配置属性spring.autoconfigure.*
- 自定义类加@Configuration注解
ImportSelector和DeferredImportSelector
都可以实现配置类分组, DeferredImportSelector可以实现延迟解析配置类上bean(在其他配置类解析完之后)
条件注解
- ConditionalOnBean:是否存在某个某类或某个名字的Bean
- ConditionalOnMissingBean:是否缺失某个某类或某个名字的Bean
- ConditionalOnSingleCandidate:是否符合指定类型的Bean只有一个
- ConditionalOnClass:是否存在某个类
- ConditionalOnMissingClass:是否缺失某个类
- ConditionalOnExpression:指定的表达式返回的是true还是false
- ConditionalOnJava:判断Java版本
- ConditionalOnJndi:JNDI指定的资源是否存在
- ConditionalOnWebApplication:当前应用是一个Web应用
- ConditionalOnNotWebApplication:当前应用不是一个Web应用
- ConditionalOnProperty:Environment中是否存在某个属性
- ConditionalOnResource:指定的资源是否存在
- ConditionalOnWarDeployment:当前项目是不是以War包部署的方式运行
- ConditionalOnCloudPlatform:是不是在某个云平台上
也可以利用@Conditional来自定义条件注解。
public class KkCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
return false;
}
}
@Conditional(value = {KkCondition.class})
@Bean
public User user() {
return new User();
}
引入starter开启自动配置
例如引入spring-boot-starter-web依赖, 会自动解析Tomcat配置类, 利用条件注解实现
@Configuration
@ConditionalOnClass({Servlet.class, Tomcat.class, UpgradeProtocol.class})
@ConditionalOnMissingBean(
value = {ServletWebServerFactory.class},
search = SearchStrategy.CURRENT
)
public static class EmbeddedTomcat {
public EmbeddedTomcat() {
}
@Bean
public TomcatServletWebServerFactory tomcatServletWebServerFactory() {
return new TomcatServletWebServerFactory();
}
}