天天看点

8.3 SpringBoot自动配置模块

@SpringBootApplication等同于下面三个注解:

@SpringBootConfiguration

@EnableAutoConfiguration

@ComponentScan

其中@EnableAutoConfiguration是关键(启用自动配置),内部实际上就去加载META-INF/spring.factories文件的信息,

然后筛选出以EnableAutoConfiguration为key的数据,加载到IOC容器中,实现自动配置功能!

下面来自:https://blog.csdn.net/zxc123e/article/details/80222967

(这篇博客写得特别好)

# Auto Configure

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

...

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\

org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\

org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\

...

在AutoConfigurationImportSelector类中可以看到通过 SpringFactoriesLoader.loadFactoryNames()

把 spring-boot-autoconfigure.jar/META-INF/spring.factories中每一个xxxAutoConfiguration文件都加载到容器中,

spring.factories文件里每一个xxxAutoConfiguration文件一般都会有下面的条件注解:

@ConditionalOnClass : classpath中存在该类时起效

@ConditionalOnMissingClass : classpath中不存在该类时起效

@ConditionalOnBean : DI容器中存在该类型Bean时起效

@ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效

@ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或@Primary的只有一个时起效

@ConditionalOnExpression : SpEL表达式结果为true时

@ConditionalOnProperty : 参数设置或者值一致时起效

@ConditionalOnResource : 指定的文件存在时起效

@ConditionalOnJndi : 指定的JNDI存在时起效

@ConditionalOnJava : 指定的Java版本存在时起效

@ConditionalOnWebApplication : Web应用环境下起效

@ConditionalOnNotWebApplication : 非Web应用环境下起效

比如我们点开RedisAutoConfiguration

@Configuration(proxyBeanMethods = false)

@ConditionalOnClass(RedisOperations.class)

@EnableConfigurationProperties(RedisProperties.class)

@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })

public class RedisAutoConfiguration {

发现@ConditionalOnClass(RedisOperations.class)中的RedisOperations是报红的,

SpringFactoriesLoader其主要功能就是从指定的配置文件META-INF/spring-factories加载配置,

spring-factories是一个典型的java properties文件,只不过Key和Value都是Java类型的完整类名。

当我在配置文件pom.xml中配置了

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-data-redis</artifactId>

</dependency>

之后,

再次点击spring.factories

# Auto Configure

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\

...

org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\

...

发现

@Configuration(proxyBeanMethods = false)

@ConditionalOnClass(RedisOperations.class)

@EnableConfigurationProperties(RedisProperties.class)

@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })

public class RedisAutoConfiguration {

@ConditionalOnClass(RedisOperations.class)中的RedisOperations已经不报红了。