2017-01-19 4 views
0

私の質問は、java.util.MapのタイプのBeanを@Autowired経由でクラスに挿入する方法に関するものです。具体的には、クラス内のAutowired Beanの値は、実際にはキーが1つのキーと値のペアを含むMapであり、そのキーはBeanの名前であり、その値は注入することを意図している。私は春が地図を直接注入したと思った。ここでマップ動作の春のオートワイヤリング

は、私は豆をautowireするクラスです。

@Component 
public class SpringMapParent { 
    @Autowired 
    @Qualifier("theMap") 
    private Map<String, Object> theMap; 

    ... 
} 

私はこのように私の春のJava構成でtheMap定義:マップのサイズが0

であることを

@Configuration 
@ComponentScan 
public class SpringMapConfiguration { 

    @Bean("theMap") 
    public Map<String, Object> getTheMap() { 
     Map<String, Object> theMap = new HashMap<String, Object>(); 
     return theMap; 
    } 

    ... 
} 

注意

この注入をテストする私のユニットテストは失敗します:

@ContextConfiguration(classes = {SpringMapConfiguration.class}) 
@RunWith(SpringJUnit4ClassRunner.class) 
public class SpringMapIT { 

    @Autowired 
    private SpringMapParent springMapParent; 

    @Test 
    public void testSpringMapParentAutowiredCorrectly() { 
     Map<String, Object> theMap = springMapParent.getTheMap(); 
     assertEquals(0, theMap.size()); 
    } 
} 

theMapの大きさは、実際には1つのエントリがあるさ:

{theMap={}} 

これはなぜでしょうか?そして、実際にbean内で定義されたマップをtheMapフィールドに直接挿入するにはどうすればよいですか?

答えて

2

@AutowiredMapは特別な処理方法です。 Documentationさんのコメント:

予想されるキータイプが文字列の場合でも、入力されたマップは自動実行できます。地図値は、予想されるタイプのすべてのBeanが含まれており、キーが対応するBeanの名前が含まれています

ますドキュメントのまた別のsectionは言う:自身がコレクション/のように定義されているBeanの

マップまたは配列タイプの場合、@Resourceは、特定のコレクションまたは配列Beanを一意の名前で参照する、すばらしいソリューションです。つまり、要素型情報が@Beanの戻り型シグニチャまたはコレクション継承階層に保持されている限り、Collection/Map型と配列型は、Springの@Autowired型一致アルゴリズムによっても照合できます。この場合、前の段落で概説したように、修飾子の値を使用して同じ型指定のコレクションから選択することができます。

だから、あなたはMap Beanを注入することができ、次の方法:

@Component 
public class SpringMapParent { 
    @Resource 
    @Qualifier("theMap") 
    private Map<String, Object> theMap; 

    ... 
} 
関連する問題