Spring中能否结合@Qualifier与@AliasFor实现别名限定符?
Spring限定符注解结合@AliasFor的功能问题
我想在Spring中创建包含多个属性的限定符注解,单独使用时功能符合预期。同时,我希望该注解的value属性与另一个属性互为别名,Spring提供的@AliasFor注解应该可以实现这个需求。
但将两者结合使用时出现了异常:@AliasFor确实产生了作用,却直接破坏了限定符的核心功能——无法找到匹配的Test类型Bean。
以下是单类示例,展示了我的预期用法:@MetaQualifier注解将value和named属性定义为彼此的别名。我通过value属性声明并限定了一个Bean,随后尝试通过value或named属性注入该Bean。若别名功能正常,两种注入方式都应生效,但实际两者均无法找到匹配的Bean,我原本至少预期通过value属性的注入能正常工作。
不过,当我注释掉@AliasFor注解后,usageTestValue(...)方法的注入突然恢复正常;若启用@Bean testNamed()方法,两种注入方式都能正常工作,但这并非我想要的效果。
显然@AliasFor会产生独特的影响,其他随机注解不会导致此问题。如果@AliasFor不支持用于限定符,我原本预期它要么无效果,要么被当作普通注解处理,但当前的表现完全不符合逻辑。
请问是否有办法实现预期功能,还是从一开始就不可行?
import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.annotation.AliasFor; @Configuration public class QualiasForTestConfig { @Bean @MetaQualifier(value = "qualifier") Test testValue() { return new Test("value"); } // @Bean // @MetaQualifier(named = "qualifier") // Test testNamed() // { // return new Test("named"); // } @Bean String usageTestValue(@MetaQualifier(value = "qualifier") Test testValue) { return "Yay!"; } @Bean String usageTestNamed(@MetaQualifier(named = "qualifier") Test testNamed) { return "Yay!"; } @Target({ElementType.PARAMETER, ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Qualifier @Documented public @interface MetaQualifier { @AliasFor("named") String value() default ""; @AliasFor("value") String named() default ""; } static class Test { private final String text; public Test(String text) { this.text = text; } @Override public String toString() { return text; } } }
内容的提问来源于stack exchange,提问作者Frettman
相关产品推荐
相关产品推荐

