【发布时间】:2020-01-31 05:13:11
【问题描述】:
使用 Spring 并给定几个实现公共接口的类,我将如何在方法级别使用 @Bean 注释来引用实现该接口的所有类?
我想检索所有实现实例,对每个实例应用一些逻辑,然后返回一个托管的 Map<String, Animal> 对象,该对象可以注入到其他类或组件中。
通用接口
public interface Animal {
String makeNoise();
}
public interface Person {
String getOccupation();
}
动物实现#1
public Dog implements Animal {
@Override
String makeNoise() {
return "Bark! Bark!";
}
}
动物实现#2
public Cat implements Animal {
@Override
String makeNoise() {
return "Meow! Meow!";
}
}
人员实施#1
public Developer implements Person {
@Override
public String getOccupation() {
return "Software Engineer";
}
}
人员实施#2
public Lawyer implements Person {
@Override
public String getOccupation() {
return "Litigator";
}
}
配置
@Configuration
public class Initialize {
//<snip> Beans created for Developer, and Lawyer objects </snip>
@Bean
Map<String, Developer> getDevelopers(List<Developer> developers) { // This is fine
return new HashMap<>(...);
}
@Bean
Map<String, Lawyer> getLawyers(List<Person> people) { // Spring wires this dependency fine
return new HashMap<>(...);
}
@Bean
Map<String, Dog> getOwners(Map<String, Person> owners) { // Spring reports it cannot auto-wire this dependency
// what do I do here?
}
}
任何帮助将不胜感激,谢谢!
【问题讨论】:
-
您需要一个
List<Animals>类型的 Bean 在运行时出现在上下文中。只有这样才能满足你想要的bean的依赖。 -
@rdas 这真的是 Spring 的唯一方法吗?我想利用类路径的运行时扫描来自动获取实现类。
-
最简单的方法是使用
@Bean方法来做同样的事情。 -
看起来可能是这个问题的重复:stackoverflow.com/questions/40286047/…
-
在你们的帮助下找到了答案,我会在回家时更新问题并提供答案。基本上利用协方差和列表来说服 Spring 将所有类/bean 连接到该列表