对spring boot中常用的注解有所了解后对后续的自定义starter会有帮助,下面就列举几个注解进行说明。
1. @PropertySource
提供了一种方便的声明性机制,用于将PropertySource添加到Spring的环境中,即用于指定要加载的配置文件。
2. @ConfigurationProperties
读取全局配置文件(properties和yml都支持)信息并自动封装成实体类。当然,如果只是在一个类上添加了这个注解,那么这个实体类是没被实例化的,自然也不能从IOC中获取到该实体对象,可以通过以下的方法来使其生效。
- 在实体类上添加
@Component
- 在配置类(添加了
@Configuration
的类)中通过添加注解@Bean
的方法中实例化该实体 - 使用
@EnableConfigurationProperties
注解 示例: 首先创建一个用户存储配置信息的实体对象
@ConfigurationProperties(prefix = "conn.info")
public class ConnConfig {
private String address ;
private Integer port ;
//getter和setter方法忽略...
}
为了让上面的实体生效,可以在实体上添加@Component
注解,例如:
@Component
@ConfigurationProperties(prefix = "conn.info")
public class ConnConfig {
... ...
}
除了添加@Component
注解外,还可以通过@Bean
注解
@Configuration(proxyBeanMethods = false)
public class MyConfiguration {
@Bean
public ConnConfig connConfig(){
return new ConnConfig() ;
}
}
同时也可以使用@EnableConfigurationProperties
注解
@Configuration(proxyBeanMethods = false)
@EnableConfigurationProperties(ConnConfig.class)
public class MyConfiguration {
... ...
}
当然,我们还可以通过@PropertySource
注解为实体对象指定配置文件,例如:
@PropertySource("classpath:conn.properties")
@ConfigurationProperties(prefix = "conn.info")
public class ConnConfig {
... ...
}
通过上面的操作后,在需要的地方就可以进行注入了: @Autowired ConnConfig connConfig;
3. @EnableConfigurationProperties
让使用了@ConfigurationProperties
注解的实体类生效,使用了该注解后可以将实体类实例化并添加到IOC容器中,见上面的示例。
4. @Conditional
指示组件仅在所有指定条件匹配时才有资格注册。@Conditional注释常用于以下几个地方
- @Configuration类
- @Bean方法
- @Component类
较常见的用法之一是实现以下接口
@FunctionalInterface
public interface Condition {
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
例如,可以通过某个配置来决定某个配置类是否生效
public class Swagger3Condition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata arg1) {
if(!context.getEnvironment().containsProperty("swagger3.open")){
return false ;
}
String swagger2 = context.getEnvironment().getProperty("swagger3.open") ;
if(StringUtils.isBlank(swagger2)){
return false ;
}
if(StringUtils.equalsIgnoreCase("true", swagger2)){
return true ;
}
return false;
}
}
在配置类上添加注解
@EnableOpenApi
@Configuration(proxyBeanMethods = false)
@Conditional(Swagger3Condition.class)
public class Swagger3Configuration {
... ...
}
除此以外,springboot中还内置了许多的条件匹配对象方便大家使用,例如:
内置Condition | 说明 |
---|---|
@ConditionalOnJava | 系统的Java版本是否满足要求 |
@ConditionalOnProperty | 系统中指定属性的值是否匹配 |
@ConditionalOnClass | 系统中是否有指定的类 |
@ConditionalOnMissingClass | 系统中是否确实指定的类 |
@ConditionalOnBean | 容器中是否存在指定的Bean |
@ConditionalOnMissingBean | 容器中是否缺失指定的Bean |
更多的Condition请参考其他资料
5. @Import
提供与Spring XML中的<import/>元素等效的功能,指示要导入的一个或多个组件类(通常为@Configuration类)。允许导入@Configuration类、ImportSelector和ImportBeanDefinitionRegister实现以及常规组件类。
①有关ImportSelector、ImportBeanDefinitionRegister的使用,请自行查询资料。②如果要从XML文件中导入,则使用@ImportResource注解
6. @EnableAutoConfiguration
就是使用了@Import注解结合DeferredImportSelector类型从META-INF/spring.factories
文件中加载配置的类,也就是自动装配的原理点所在。