本文目录
1 基础注解
@SpringBootApplication
@ComponentScan
@EnableAutoConfiguration
@EnableWebMvc
2 导入注解
@Import
@ImportResource
@PropertySource
3 配置注解
@ConfigurationProperties
4 条件注解
@ConditionalOnProperty
@ConditionalOnExpression
@ConditionalOnBean
5 相关文章
等价于@Configuration + @ComponentScan + @EnableAutoConfiguration三个注解。
在Spring启动阶段,自动扫描指定路径下的文件,将@Configuration、@Component、@Controller、@Service、@Repository注解的类加入到Bean清单。
常用格式:
@ComponentScan(basePackages = {"com.demo.www"}) 指定扫描包路径
在Spring启动阶段,根据META-INF/spring.factories文件,对其中设置的自动配置项目进行自动载入。
同时,自动扫描并导入 @Configuration 注解的类配置。
只能添加到 @Configuration 类,相当于继承 WebMvcConfigurationSupport,但未重写任何方法。
若需要在原有基础上,扩展配置内容,可以直接继承 WebMvcConfigurationSupport 类,并重写相应的方法。
若添加 @EnableWebMvc 或 继承 WebMvcConfigurationSupport,将使 @EnableAutoConfiguration 失效(不再自动配置),而是通过 WebMvcConfigurationSupport 进行配置。
默认情况下,只有入口类的配置生效,可通过该注解,导入其它配置清单(其它@Configuration注解的类)。
若在入口类已使用 @SpringBootApplication 或 @EnableAutoConfiguration 注解,则无需通过 @Import 导入其它 @Configuration 注解的类,Spring Boot 框架会自动扫描并导入这些 @Configuration 注解的类。
类似@Import注解,但该注解用来导入配置清单文件(xml等),而不是@Configuration注解的类。
Spring Boot中默认引入application.properties配置文件,若有多个配置文件,需要通过该注解将其它配置文件引入。
常用格式:
@PropertySource({"classpath:a.properties", "classpath:b.properties", ...}) 导入 a 和 b 文件的配置内容
示例:
@SpringBootApplication
@PropertySource({"classpath:es.properties", "classpath:hbase.properties"})
public class ApiApplication {
// 代码部分
}
通过该注解,可以自动将配置文件的配置内容,注入到类对象相应的字段中。
常用格式:
@ConfigurationProperties(prefix = "xxx.xxx.xxx") 指定前缀,自动注入 prefix.字段名(以-分隔驼峰命名) 配置。
示例:
@Configuration
@ConfigurationProperties(prefix = "redis.slave")
public class RedisSlaveConfig {
// 自动注入 redis.slave.host 配置内容
private String host;
// 自动注入 redis.slave.port 配置内容
private int port;
// 自动注入 redis.slave.db 配置内容
private int db;
// 自动注入 redis.slave.password 配置内容
private String password;
// 自动注入 redis.slave.max-total 配置内容
private int maxTotal;
// 自动注入 redis.slave.max-idle 配置内容
private int maxIdle;
// 自动注入 redis.slave.min-idle 配置内容
private int minIdle;
}
通过配置内容控制 @Configuration 或 @Bean 是否生效。
常用格式:
@ConditionalOnProperty("xxx.xxx") 若存在 xxx.xxx 配置项 且 值不为 false,则通过条件检测。
@ConditionalOnProperty(name="xxx.xxx", havingValue="yyy") 若存在 xxx.xxx 配置项 且 值为 yyy,则通过条件检测。
注意:
由于配置文件在编译时,就已经确定了配置项的值。因此,在扫描 Resource 资源时,便进行 @ConditionalOnProperty 指定的条件匹配判断,若不匹配,则不识别相应的Bean定义。
示例:
@Configuration
@ConditionalOnProperty("spring.application.demo.enabled")
public class DemoConfig {
}
@Configuration
@ConditionalOnProperty(name="spring.application.name", havingValue="demo")
public class DemoConfig {
}
通过表达式控制 @Configuration 或 @Bean 是否生效,当表达式为 true 时生效。
常用格式:
@ConditionalOnExpression("${xxx.xxx}=='demo' or ${yyy.yyy} = 'true'") 指定判断逻辑
仅当 BeanFactory 中已经包含指定的 Bean Class 和/或 Bean Name 时才匹配条件。
该条件只能匹配到目前已处理的Bean定义,因此,Bean定义的处理顺序将影响该匹配条件结果。
常用格式:
@ConditionalOnBean({A.class, B.class}) 当存在 A类Bean对象 或 B类Bean对象 时,通过条件检测。
注意:
@ConditionalOnProperty 条件在扫描 Resource 资源时,便进行匹配判断;
对于通过匹配判断的 Bean 定义,将会被临时加入到一个清单列表;
此后,按照一定顺序对清单列表中的 Bean 进行 @ConditionalOnBean 条件判断,
检测当前清单列表是否存在指定Bean定义;
对于通过未通过匹配判断的Bean定义,将会从清单列表移除;
最终,清单列表为已确认的Bean定义,开始对其进行初始化操作。
由此可知,由于@ConditionalOnBean是基于当前清单列表进行检查,因此,Bean的处理顺序将影响最终结果,也可能由此出现不符合预期的结果。
例如:A 依赖 B,B 依赖 C,且 C 通过 @ConditionalOnProperty 可预知不会通过匹配条件,清单列表将临时存留 A 和 B,若处理顺序为 A、B,将会出现如下情况:
(1)A通过匹配,因为,此时B存在于当前清单列表;
(2)B未通过匹配,因为,此时C已不存在于清单列表;
此后,在对 A 进行初始化时,将会发生异常,找不到B的定义。
《Spring Boot 学习笔记:以JSON格式返回对象》
《Spring Boot 学习笔记:Schedule》
《Spring Boot 学习笔记:MongoTemplate 移除 _class 字段》
《Spring Boot 学习笔记:启动过程方法》
《Spring Boot 学习笔记:请求数据的解析绑定与返回数据的处理》