Java 自定义Spring(启动)批注:@ConditionalOnProperty,具有默认键名

Java 自定义Spring(启动)批注:@ConditionalOnProperty,具有默认键名,java,spring,spring-boot,Java,Spring,Spring Boot,如何创建“继承”@conditionalnproperty,但预定义属性键的自定义Spring(Boot)注释@Country 给定了一些共享公共接口的服务 interface WizardService { void doMagic() } 以及通过@conditionalnproperty(name=“country”,havingValue=“[iso code]”)选择的一组特定于国家/地区的实现,即基于国家/地区属性的值选择实现 是否可以定义一个自定义spring注释,该注释在

如何创建“继承”
@conditionalnproperty
,但预定义属性键的自定义Spring(Boot)注释
@Country

给定了一些共享公共接口的服务

interface WizardService {
   void doMagic()
}
以及通过
@conditionalnproperty(name=“country”,havingValue=“[iso code]”)选择的一组特定于国家/地区的实现,即基于国家/地区属性的值选择实现

是否可以定义一个自定义spring注释,该注释在默认情况下总是将
name
属性设置为“country”,这样我就可以有一个
@country
注释?例如:

@Country("en")
@Service
class WizardServiceGreatBritain {
   @Override void doMagic() { System.out.println("Wingardium Leviosa!"); }
}
我试图创建一个元注释,但它被忽略了(用它的
@ConditionalOnProperty
等价物替换它时效果很好):


考虑到Spring中对元注释的广泛支持,我会尝试使用
@ConditionalOnProperty
注释您的自定义注释本身,并检查它是否有效。请参见此处:获取公开
havingValue
属性的方法,以及此处:获取别名属性的方法不幸的是,它不起作用。我在SSCE中尝试了它,并相应地更新了问题。问题是实际值没有被
havingValue
属性替换。我的意思是,如果您调试这个文件
onPropertyCondition::GetMatchOutput
,您将看到
havingValue
的值是空字符串,而不是像这样的注释中的值(元注释)不适用于springboot自动配置类。您唯一能做的是:实现您自己的自定义条件。
@Country("en")
@Service
class WizardServiceGreatBritain {
   @Override void doMagic() { System.out.println("Wingardium Leviosa!"); }
}
@ConditionalOnProperty(name = "country")
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
public @interface Country {

    @AliasFor(annotation = ConditionalOnProperty.class, attribute = "havingValue")
    String havingValue() default "";
}