对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文件中加载配置的类,也就是自动装配的原理点所在。