如何自定义继承@ConditionalOnProperty且预定义属性键的@Country注解?
如何正确实现自定义的@Country条件注解替代@ConditionalOnProperty?
你的问题核心是想用自定义注解简化@ConditionalOnProperty(name = "country", havingValue = "xxx")的写法,但元注解配置没被Spring正确识别。问题出在注解属性的别名映射和默认属性名上,下面是正确的实现方案:
正确的@Country注解实现
要让Spring正确识别这个元注解,需要做到两点:
- 把自定义注解的默认属性设为
value(这样就能用@Country("en")这种简化写法) - 用
@AliasFor正确绑定到ConditionalOnProperty的对应属性
完整代码如下:
@ConditionalOnProperty(name = "country") @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) @Documented public @interface Country { // 把默认属性设为value,同时映射到ConditionalOnProperty的havingValue @AliasFor(annotation = ConditionalOnProperty.class, attribute = "havingValue") String value() default ""; }
使用示例
现在你可以直接用简化写法标记你的Service类了:
@Country("de") @Service class WizardServiceGermany { @Override void doMagic() { System.out.println("Simsalabim!"); } } @Country("en") @Service class WizardServiceGreatBritain { @Override void doMagic() { System.out.println("Wingardium Leviosa!"); } }
为什么之前的实现失败?
你之前的注解用了havingValue作为属性名,而不是默认的value。当你写@Country("en")时,Spring会把这个值赋值给注解的value属性,但你的注解里没有value属性,所以havingValue其实是空的,导致Spring无法正确匹配条件。
另外,确保你的Spring版本支持元注解的@AliasFor功能(Spring 4.2+就支持了),如果版本过低也可能出现识别问题。
内容的提问来源于stack exchange,提问作者user3001
相关产品推荐
相关产品推荐

