SpringBoot自动配置自定义条件注解怎么写才有效
要在SpringBoot自动配置中让自定义条件注解真正生效,必须同时满足注解声明、条件逻辑实现、运行时加载三重约束。需定义带@Conditional的注解并绑定非抽象Condition实现类,该类matches方法须安全判空处理profile,再在配置类或@Bean方法上使用,并通过激活对应profile验证加载效果。

要在SpringBoot自动配置中让自定义条件注解真正生效,必须同时满足注解声明、条件逻辑实现、运行时加载三重约束,缺一不可——比如只写注解不配Condition实现类,Spring容器根本不会识别该条件。
定义注解并绑定Condition实现类
创建自定义注解@ConditionalOnProduction,用@Conditional指定具体的条件判断逻辑类:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Conditional(OnProductionEnvCondition.class)
public @interface ConditionalOnProduction {}
【OnProductionEnvCondition.class必须是实现了Condition接口的非抽象类】,否则Spring在解析注解时会抛出IllegalStateException。
编写Condition实现类
新建OnProductionEnvCondition类,实现matches方法,判断是否为生产环境:
public class OnProductionEnvCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String profile = context.getEnvironment().getActiveProfiles()[0];
return "prod".equals(profile);
}
}
注意:如果项目未激活任何profile,getActiveProfiles()返回空数组,直接取[0]会触发ArrayIndexOutOfBoundsException。应先判空再取值。
在自动配置类中使用自定义条件注解
方法一:直接标注在@Configuration类上
@Configuration
@ConditionalOnProduction
public class ProductionOnlyConfig {
@Bean
public RedisTemplate
}
方法二:标注在@Bean方法上,粒度更细
@Configuration
public class AppConfig {
@Bean
@ConditionalOnProduction
public ScheduledTaskExecutor taskExecutor() { ... }
}
这一步操作起来很简单,直接把@ConditionalOnProduction加到目标类或方法上方就行。
验证条件是否真正触发
第一步:启动应用时显式指定生产环境profile:
java -jar app.jar --spring.profiles.active=prod
第二步:观察控制台日志,确认ProductionOnlyConfig类被加载(Spring Boot启动日志中会出现"Loading XML bean definitions from class path resource"或类似提示)。
第三步:切换为dev环境再次启动:
java -jar app.jar --spring.profiles.active=dev
此时ProductionOnlyConfig中的Bean不应出现在ApplicationContext中,可通过@Autowired注入测试或调用applicationContext.getBeanNamesForType(RedisTemplate.class)验证返回结果为空数组。