Spring Qualifier注解能否沿依赖链传递?多实现Autowired注入问题
解决方案
要实现将@Qualifier从Controller传递到AnimalProcessor,从而自动注入对应Fetcher的需求,你可以通过为AnimalProcessor创建带限定符的Bean实例来实现,完全贴合静态场景,不需要工厂类。
步骤1:给Fetcher实现类标记限定符
先给不同的Fetcher实现类加上对应的标识,推荐用自定义限定符注解(类型更安全),也可以直接用字符串@Qualifier:
方式A:自定义限定符注解(推荐)
// 自定义Cat限定符 @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface Cat {} // 自定义Dog限定符 @Target({ElementType.FIELD, ElementType.PARAMETER, ElementType.METHOD}) @Retention(RetentionPolicy.RUNTIME) @Qualifier public @interface Dog {} // 给CatFetcher绑定Cat限定符 @Component @Cat public class CatFetcher implements Fetcher {} // 给DogFetcher绑定Dog限定符 @Component @Dog public class DogFetcher implements Fetcher {}
方式B:字符串类型@Qualifier
如果不想自定义注解,直接给组件命名:
@Component("CatFetcher") public class CatFetcher implements Fetcher {} @Component("DogFetcher") public class DogFetcher implements Fetcher {}
步骤2:创建带限定符的AnimalProcessor Bean
在配置类中,为Cat和Dog分别创建AnimalProcessor实例,注入对应Fetcher并标记匹配的限定符:
对应方式A的配置
@Configuration public class AnimalConfig { @Bean @Qualifier("Cat") public AnimalProcessor catProcessor(@Cat Fetcher fetcher) { return new AnimalProcessor(fetcher); } @Bean @Qualifier("Dog") public AnimalProcessor dogProcessor(@Dog Fetcher fetcher) { return new AnimalProcessor(fetcher); } }
对应方式B的配置
@Configuration public class AnimalConfig { @Bean @Qualifier("Cat") public AnimalProcessor catProcessor(@Qualifier("CatFetcher") Fetcher fetcher) { return new AnimalProcessor(fetcher); } @Bean @Qualifier("Dog") public AnimalProcessor dogProcessor(@Qualifier("DogFetcher") Fetcher fetcher) { return new AnimalProcessor(fetcher); } }
步骤3:Controller中正常注入
保持你原有的Controller代码即可,Spring会自动匹配对应限定符的AnimalProcessor:
@RestController public class CatController { private final AnimalProcessor processor; // 构造器注入(推荐),也可以用字段注入加@Qualifier public CatController(@Qualifier("Cat") AnimalProcessor processor) { this.processor = processor; } } @RestController public class DogController { private final AnimalProcessor processor; public DogController(@Qualifier("Dog") AnimalProcessor processor) { this.processor = processor; } }
原理说明
这种实现和Dagger2的限定符绑定逻辑类似:我们为AnimalProcessor生成了两个带不同标识的Bean实例,每个实例内部已经绑定了对应类型的Fetcher。当Controller通过@Qualifier请求特定标识的AnimalProcessor时,Spring会直接返回预先配置好的实例,间接实现了Qualifier的"传递"效果。
内容的提问来源于stack exchange,提问作者sss
相关产品推荐
相关产品推荐

