我有一个带有几个子类B,C,D的抽象类A,我希望有一个Map with Spring自动将所有子类注入Map。
我即将从A创建许多子类,我不想在创建它们之后也填充XML,因此Spring可以将它们放在Map中(它的双重工作和繁琐)。我希望Spring能够获取所有这些子类并自动将它们放在Map中,而不需要庞大的XML。
我理解Map需要为子类bean的每个实例提供一个键。
到目前为止这样做:
public abstract class A{}
@Bean(name = "Bbean")
public class B extends A{}
@Bean(name = "Cbean")
public class C extends A{}
@Bean(name = "Dbean")
public class D extends A{}
最后我希望这个工作,当我引用它时不能为空:
@Autowired
private Map<String, A> map;
如何在Spring Framework中进行设置?
答案 0 :(得分:1)
好的,您希望自动检测到您的bean,然后自动收集它们。
因此,使用类似@Component的注释(例如@ Component,@ Service,@ Repository,@ Controller等)注释您的B,C,D类,然后使用@ComponentScan来检测它们。 (@Bean用于其他目的,你没有在你的例子中正确使用它)。
然后使用@Autowired注释收集所有类型A的bean:
@Autowired List<A> allAs;
现在你想制作一张地图,所以要让所有这些bean bean知道名字:
class A implements BeanNameAware {...}
最后,您从@Autowired列表中创建了一个地图:
class AsMapHolder implements InitializingBean {
@Autowired private List<A> allAs;
private Map<String, A> nameToA = new LinkedHashMap<String, A>();
@Override void afterPropertiesSet() {
for (A a: allAs) {
nameToA.put(a.getName(), a); //getName() is from BeanNameAware, populated automatically
}
}
}
它应该工作。
更新:只需&#39; @Autowired Map beanNameToA; &#39;也应该工作