2014-09-20 78 views
1

我有一个抽象类A和几个子类B,C,D,我希望有一个Map自动将所有子类注入到Map中。使用Spring框架自动填充使用子类的地图

我即将从A创建许多子类,并且我不想在创建它们之后也填充XML,以便Spring可以将它们放入Map中(它的双重工作和乏味)。我希望Spring能够接受所有这些子类,并将它们自动放入Map中,而不需要庞大的XML。

我明白我需要给每个子类的实例一个键的映射。

所以有这个至今:

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框架?

+0

你真的需要一张地图吗?列表这只是工作。尚未使用地图进行自动装配。 – 2014-09-20 12:23:02

+0

你为什么要这样做? – 2014-09-20 12:53:05

回答

0

好的,你想让你的豆自动检测,然后自动收集它们。
所以用@Component-like注释(例如@Component,@Service,@Repository,@Controller等)注释你的B,C,D类,然后使用@ComponentScan来检测它们。 (@Bean被用于其他目的,你没有在你的例子中正确使用它)。
然后你收集A型的所有豆@Autowired注解:

@Autowired List<A> allAs; 

现在要进行映射,从而使所有这些豆豆名感知:

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 
     } 
    } 
} 

它应该工作。

更新:简单的“@Autowired地图beanNameToA;'应该还能工作

+0

感谢它的工作,我只是想,如果你可以自动装载一个列表,像你一样,肯定可以根据我的要求自动装载地图 - 没有你写的所有样板代码。我没有足够的信誉来投票给你。 – 2014-09-20 14:01:33

+0

问题是你为什么需要它。看起来像你创建另一个小的Spring容器。请注意,您可以始终从Spring应用程序上下文中获取任何bean的名称,只需让您的bean实现ApplicationContextAware接口即可。 – Alexander 2014-10-04 08:11:53