SpringBoot 启动流程
1、@SpringBootApplication注解中引入了@EnableAutoConfiguration注解
2、@EnableAutoConfiguration注解中@Import(AutoConfigurationImportSelector.class)
3、AutoConfigurationImportSelector.Class实现了ImportSelector接口,在实现方法String[]selectImports中
-
获取加载 META-INF/spring.factories文件中的自动配置信息
-
removeDuplicates(configurations)排除重复的信息
-
可以在@SpringBootApplication去除自己不想用的(exclude=RedisAutoConfiguration.class)去除的逻辑就是以上图中的这几行代码
1、Set<String> exclusions = getExclusions(annotationMetadata, attributes); 2、checkExcludedClasses 3、configurations.removeAll(exclusions);
如果当前项目很多我们不用的就会被加载到容器中,就很占空间,所以通过configurations = getConfigurationClassFilter().filter(configurations);方法就可以过滤出我们要用到的。
哪些是我们要用到的呢,通过什么匹配过滤?
autoConfigurationMetadata = AutoConfigurationMetadataLoader.loadMetadata(classLoader); 方法数据来源META-INF/spring-autoconfigure-metadata.properties所有文件 例如:
- org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration= org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration.ConditionalOnClass=org.springframework.data.redis.core.RedisOperations需要有RedisOperations这个class才会触发redis的自动配置,然后从自动配置的所有集合过滤后留下来
- org.springframework.boot.autoconfigure.cache.RedisCacheConfiguration.ConditionalOnBean=org.springframework.data.redis.connection.RedisConnectionFactory 需要容器中有RedisConnectionFactory这个bean才会配置
也可以通过注解实现,例如:
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(AuthenticationManager.class)
@ConditionalOnBean(ObjectPostProcessor.class)
@ConditionalOnMissingBean(value = { AuthenticationManager.class, AuthenticationProvider.class, UserDetailsService.class }, type = { "org.springframework.security.oauth2.jwt.JwtDecoder",
"org.springframework.security.oauth2.server.resource.introspection.OpaqueTokenIntrospector" })
public class UserDetailsServiceAutoConfiguration {
}
三个Condition都要成立才会加载自定义第三方中间件,去整合到spring中的重点
(1)定义好自己工程中的spring.factories文件
(2)也可以通过文件的方式(spring-autoconfigure-metadata.properties)定义我们载入的条件