使用Spring Framework自动使用子类填充Map

时间:2014-09-20 12:02:55

标签: spring

我有一个带有几个子类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中进行设置?

1 个答案:

答案 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;也应该工作