如何修改自定义@Qualifier传入值并传递给委托@Qualifier?
实现自定义@Van注解的Bean名称格式化匹配
完全可以实现这个需求,核心是通过自定义Spring的自动装配候选解析逻辑,修改@Van注解传入值的匹配规则,将传入的前缀与固定后缀拼接后匹配目标Bean名称。
步骤1:自定义AutowireCandidateResolver
继承Spring的QualifierAnnotationAutowireCandidateResolver,重写qualifierMatches方法,专门处理@Van注解的value值格式化:
import org.springframework.beans.factory.annotation.QualifierAnnotationAutowireCandidateResolver; import org.springframework.core.annotation.AnnotationUtils; import java.lang.annotation.Annotation; public class VanQualifierResolver extends QualifierAnnotationAutowireCandidateResolver { @Override protected boolean qualifierMatches(Annotation qualifier, Object beanName) { // 检测当前注解是否为自定义@Van Van vanAnnotation = AnnotationUtils.getAnnotation(qualifier, Van.class); if (vanAnnotation != null) { // 将传入的值拼接"Vehicle"后缀,生成目标Bean名称 String targetBeanName = vanAnnotation.value() + "Vehicle"; // 匹配格式化后的名称与Bean的实际名称 return targetBeanName.equals(beanName); } // 其他注解沿用默认匹配逻辑 return super.qualifierMatches(qualifier, beanName); } }
步骤2:注册自定义解析器到Spring容器
通过配置类将自定义解析器注入到Spring的Bean工厂中,替换默认的解析逻辑:
import org.springframework.context.annotation.Configuration; import org.springframework.beans.factory.support.DefaultListableBeanFactory; import org.springframework.context.ApplicationContext; import javax.annotation.PostConstruct; @Configuration public class AutowireConfig { private final ApplicationContext applicationContext; public AutowireConfig(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @PostConstruct public void setupCustomResolver() { DefaultListableBeanFactory beanFactory = (DefaultListableBeanFactory) applicationContext.getAutowireCapableBeanFactory(); beanFactory.setAutowireCandidateResolver(new VanQualifierResolver()); } }
效果验证
现在使用@Van("green")进行自动装配时,Spring底层会自动将值格式化为greenVehicle,匹配对应的Bean:
// 自动装配greenVehicle Bean @Van("green") private Vehicle greenVan; // 自动装配redVehicle Bean @Van("red") private Vehicle redVan;
这种方式只会针对@Van注解做特殊处理,不会影响Spring默认的@Qualifier或其他自动装配逻辑。
内容的提问来源于stack exchange,提问作者Ryan Wong
相关产品推荐
相关产品推荐

