手机版

SpringBoot自动配置自定义条件注解怎么写才有效

时间:2026-09-09 227
要在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 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)验证返回结果为空数组。

女子学校安检员安卓最新版
6.0
模拟经营 20 MB
扫一扫手机安装更便捷