使用Spring框架使用子类自动填充映射
我有一个抽象类A和几个子类B、C、D,我想有一个映射,Spring自动将所有子类注入到映射中 我将从中创建许多子类,我不想在创建它们之后也填充XML,这样Spring就可以将它们放在一个映射中(它的双重工作和繁琐)。我希望Spring能够获取所有这些子类,并自动将它们放到地图中,而不需要庞大的XML 我知道对于映射,我需要为子类bean的每个实例提供一个键 到目前为止:使用Spring框架使用子类自动填充映射,spring,Spring,我有一个抽象类A和几个子类B、C、D,我想有一个映射,Spring自动将所有子类注入到映射中 我将从中创建许多子类,我不想在创建它们之后也填充XML,这样Spring就可以将它们放在一个映射中(它的双重工作和繁琐)。我希望Spring能够获取所有这些子类,并自动将它们放到地图中,而不需要庞大的XML 我知道对于映射,我需要为子类bean的每个实例提供一个键 到目前为止: 公共抽象类A{} @Bean(name=“Bbean”) 公共类B扩展了{} @Bean(name=“Cbean”) 公共类C
公共抽象类A{}
@Bean(name=“Bbean”)
公共类B扩展了{}
@Bean(name=“Cbean”)
公共类C扩展了{}
@Bean(name=“Dbean”)
公共类D扩展了{}
好的,您希望bean自动检测,然后自动收集它们因此,用@Component-like注释(例如@Component、@Service、@Repository、@Controller等)来注释B、C、D类,然后使用@ComponentScan来检测它们。(@Bean用于其他目的,您在示例中没有正确使用它)
然后使用@Autowired annotation:
收集类型A的所有bean
@Autowired List<A> allAs;
最后,从@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
}
}
}
类AsMapHolder实现初始化bean{
@自动连线私人列表;
私有映射名toa=新LinkedHashMap();
@重写void afterPropertieSet(){
为了(A:allAs){
nameToA.put(a.getName(),a);//getName()来自BeanNameware,自动填充
}
}
}
它应该会起作用更新:只需“@自动连线地图beanNameToA“也可以你真的需要地图吗?对于一个列表,这只是工作。还没有使用映射进行自动关联。为什么要这样做?谢谢它成功了,我只是在想,如果你能像你那样用一行代码自动关联一个列表,当然你可以根据我的要求自动关联一个映射,而不需要你写的所有样板代码。我没有足够的信誉来投票支持你。问题是你为什么需要它。看起来您创建了另一个小Spring容器。注意,您总是可以从Spring应用程序上下文中通过名称获取任何bean,只需让您的bean实现ApplicationContextAware接口即可。
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
}
}
}