使用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!";
}
} Person实现#1
public Developer implements Person {
@Override
public String getOccupation() {
return "Software Engineer";
}
}Person实现#2
public Lawyer implements Person {
@Override
public String getOccupation() {
return "Litigator";
}
}Configuration
@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?
}
}任何帮助都将不胜感激,谢谢!
发布于 2019-10-02 02:31:41
需要利用与List的协方差。见下面的伪代码/代码片段。
@Configuration
public class Initialize {
//<snip> Beans created for Developer, and Lawyer objects </snip>
@Bean
Map<String, Developer> getDevelopers(List<Developer> developers) {
return new HashMap<>(...);
}
@Bean
Map<String, Lawyer> getLawyers(List<Person> people) {
return new HashMap<>(...);
}
@Bean
Map<String, Dog> getOwners(List<Map<String, ? extends Person>> owners) { // Spring will auto-wire the "owners" variable
// with all bean objects that match this signature
// (✅ Map<String, Lawyer>, ✅ Map<String, Developer> ...)
}
}资源:
发布于 2019-10-01 22:05:17
试试这种配置。这里唯一的一点是,集合中bean的顺序是随机的,不能被控制。
@Configuration
public class CollectionConfig {
@Bean
public Animal getCat() {
return new Cat();
}
@Bean
public Animal getDog() {
return new Dog();
}
@Bean
Map<String, Animals> gatherAnimals(List<Animals> animals) {
// any code
}
}下面是关于那个https://www.baeldung.com/spring-injecting-collections的更多信息
https://stackoverflow.com/questions/58192781
复制相似问题