Spring Boot 学习笔记:常见注解

本文目录

1 基础注解

@SpringBootApplication

@ComponentScan

@EnableAutoConfiguration

@EnableWebMvc

2 导入注解

@Import

@ImportResource

@PropertySource

3 配置注解

@ConfigurationProperties

4 条件注解

@ConditionalOnProperty

@ConditionalOnExpression

@ConditionalOnBean

5 相关文章


 

1 基础注解

@SpringBootApplication

等价于@Configuration + @ComponentScan + @EnableAutoConfiguration三个注解。

 

@ComponentScan

在Spring启动阶段,自动扫描指定路径下的文件,将@Configuration、@Component、@Controller、@Service、@Repository注解的类加入到Bean清单。

 

常用格式:

@ComponentScan(basePackages = {"com.demo.www"})    指定扫描包路径

 

@EnableAutoConfiguration

在Spring启动阶段,根据META-INF/spring.factories文件,对其中设置的自动配置项目进行自动载入。

同时,自动扫描并导入 @Configuration 注解的类配置。

 

@EnableWebMvc

只能添加到 @Configuration 类,相当于继承 WebMvcConfigurationSupport,但未重写任何方法。

若需要在原有基础上,扩展配置内容,可以直接继承 WebMvcConfigurationSupport 类,并重写相应的方法。

若添加 @EnableWebMvc 或 继承 WebMvcConfigurationSupport,将使 @EnableAutoConfiguration 失效(不再自动配置),而是通过 WebMvcConfigurationSupport 进行配置。

 

2 导入注解

@Import

默认情况下,只有入口类的配置生效,可通过该注解,导入其它配置清单(其它@Configuration注解的类)。

若在入口类已使用 @SpringBootApplication 或 @EnableAutoConfiguration 注解,则无需通过 @Import 导入其它 @Configuration 注解的类,Spring Boot 框架会自动扫描并导入这些 @Configuration 注解的类。

 

@ImportResource

类似@Import注解,但该注解用来导入配置清单文件(xml等),而不是@Configuration注解的类。

 

@PropertySource

Spring Boot中默认引入application.properties配置文件,若有多个配置文件,需要通过该注解将其它配置文件引入。

 

常用格式:

@PropertySource({"classpath:a.properties", "classpath:b.properties", ...})    导入 a 和 b 文件的配置内容

 

示例:

@SpringBootApplication
@PropertySource({"classpath:es.properties", "classpath:hbase.properties"})
public class ApiApplication {
  // 代码部分
}

 

3 配置注解

@ConfigurationProperties

通过该注解,可以自动将配置文件的配置内容,注入到类对象相应的字段中。

 

常用格式:

@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;
}

 

4 条件注解

@ConditionalOnProperty

通过配置内容控制 @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 {

}

 

@ConditionalOnExpression

通过表达式控制 @Configuration 或 @Bean 是否生效,当表达式为 true 时生效。

 

常用格式:

@ConditionalOnExpression("${xxx.xxx}=='demo' or ${yyy.yyy} = 'true'")    指定判断逻辑

 

@ConditionalOnBean

仅当 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的定义。

 

5 相关文章

《Spring Boot 学习笔记:以JSON格式返回对象》

《Spring Boot 学习笔记:Schedule》

《Spring Boot 学习笔记:MongoTemplate 移除 _class 字段》

《Spring Boot 学习笔记:启动过程方法》

《Spring Boot 学习笔记:请求数据的解析绑定与返回数据的处理》

 

你可能感兴趣的:(Spring)