2014-09-20 65 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