Springフレームワークで定数、List、Map、Propertiesを外部から注入する方法

Spring Frameworkにおいて、クラスのフィールドに定数、又はjava.utilパッケージのList、Map、Propertiesを設定したい場合、Bean定義ファイルの書き方について、主に以下の種類があります。

- アノテーションを使用しない場合のBean定義
- アノテーションを使用する場合のBean定義
- util名前空間を使用する場合のBean定義

#アノテーションを使用しない場合のBean定義

###注入対象クラス
アノテーションを使用しない場合に、注入対象のフィールドに対して、setメソッドを作成する必要があります。

```java
public class B000001BLogic {

    // 定数
    private String isolation_level;
    
    /**
     * 定数の設定
     * @param isolation_level
     */
    public void setIsolation_level(String isolation_level) {
    	this.isolation_level = isolation_level;
    }
    
    // プロパティ情報
    private Properties jdbcConfiguration;
    
    /**
     * プロパティ情報の設定
     * @param jdbcConfiguration
     */
    public void setJdbcConfiguration(Properties jdbcConfiguration) {
    	this.jdbcConfiguration = jdbcConfiguration;
    }

    // リスト
    private List<String> carList;
    
    /**
     * リストの設定
     * @param carList
     */
    public void setCarList(List<String> carList) {
    	this.carList = carList;
    }
    
    // マップ
    private HashMap<String, String> carMap;
    
    /**
     * マップの設定
     * @param carMap
     */
    public void setCarMap(HashMap<String, String> carMap) {
    	this.carMap = carMap;
    }
}
```

###Bean定義ファイル

```xml
<bean id="b000001BLogic" class="jp.sample.b000001.blogic.B000001BLogic">

    <!-- 定数の定義-->
    <property name="isolation_level">
        <bean id="java.sql.Connection.TRANSACTION_SERIALIZABLE" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean" />
    </property>
    
    <!-- プロパティファイル情報の定義-->
    <property name="jdbcConfiguration">
        <bean id="jdbcConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
            <property name="location" value="classpath:SqlMapConfig/jdbc.properties" />
        </bean>
    </property>

    <!-- リストの定義 -->
    <property name="carList">
        <list value-type="java.lang.String">
            <value>Honda</value>
            <value>Toyota</value>
        </list>
    </property>

    <!-- Mapの定義 -->
    <property name="carMap">
        <map>
            <entry key="key1">
                <value>Honda</value>
            </entry>
            <entry key="key2">
                <value>Toyota</value>
            </entry>
        </map>
    </property>

</bean>
```


#アノテーションを使用する場合のBean定義

Bean定義ファイルにおいて、`ListFactoryBean`, `MapFactoryBean`といった`org.springframework.beans.factory.config`配下のFactoryBean を利用することで、アノテーションでの値注入が可能となります。また、アノテーションを使用する場合に、setメソッドが不要であるため、ソースコードの可読性が高くなります。

| 　 FactoryBeanの種類 |　　  　説明 |
|:----------------------|:-------------------|
| `FieldRetrievingFactoryBean`      | 定数の定義 |
| `PropertiesFactoryBean`    | プロパティ情報の定義  |
| `ListFactoryBean`          | リストの定義  |
| `MapFactoryBean`           | マップの定義  |
| `SetFactoryBean`           | セットの定義  |

###注入対象クラス

```java
@Component
public class B000001BLogic {
    
    // 定数
    @Resource
    private String isolation_level;
    
    // プロパティ情報
    @Resource
    private Properties jdbcConfiguration;
    
    // リスト
    @Resource
    private List<String> carList;
    
    // マップ
    @Resource
    private HashMap<String, String> carMap;
    
}
```

###Bean定義ファイル

```xml
<!-- 定数の定義-->
<bean id="isolation_level" class="org.springframework.beans.factory.config.FieldRetrievingFactoryBean">
    <property name="staticField" value="java.sql.Connection.TRANSACTION_READ_COMMITTED" />
</bean>

<!-- プロパティファイル情報の定義-->
<bean id="jdbcConfiguration" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="location" value="classpath:SqlMapConfig/jdbc.properties" />
</bean>

<!-- リストの定義 -->
<bean id="carList" class="org.springframework.beans.factory.config.ListFactoryBean">
    <property name="sourceList">
        <list value-type="java.lang.String">
            <value>Honda</value>
            <value>Toyota</value>
        </list>
    </property>
</bean>

<!-- Mapの定義 -->
<bean id="carMap" class="org.springframework.beans.factory.config.MapFactoryBean">
    <property name="sourceMap">
        <map>
            <entry key="key1">
                <value>Honda</value>
            </entry>
            <entry key="key2">
                <value>Toyota</value>
            </entry>
        </map>
	</property>
</bean>
```

#util名前空間を使用する場合のBean定義

Spring 2.0 以降で導入された xsd の util 名前空間を使用することで、Bean定義ファイルの可読性が更に高くなります。

| utilタグの種類 |　　　　説明 |
|:----------------------|:-------------------|
| \<util:constant/>      | 定数の定義 |
| \<util:properties/>    | プロパティ情報の定義  |
| \<util:list/>          | リストの定義  |
| \<util:map/>           | マップの定義  |
| \<util:set/>           | セットの定義  |

###注入対象クラス

```java
@Component
public class B000001BLogic {
    
    // 定数
    @Resource
    private String isolation_level;
    
    // プロパティ情報
    @Resource
    private Properties jdbcConfiguration;
    
    // リスト
    @Resource
    private List<String> carList;
    
    // マップ
    @Resource
    private HashMap<String, String> carMap;
    
}
```

###Bean定義ファイル

```xml
<!-- 定数の定義-->
<util:constant id="isolation_level" static-field="java.sql.Connection.TRANSACTION_SERIALIZABLE" />

<!-- プロパティファイル情報の定義-->
<util:properties id="jdbcConfiguration"   location="classpath:SqlMapConfig/jdbc.properties"/> 

<!-- リストの定義 -->
<util:list id="carList" value-type="java.lang.String">
    <value>Honda</value>
    <value>Toyota</value>
</util:list>

<!-- Mapの定義 -->
<util:map id="carMap" key-type="java.lang.String" value-type="java.lang.String">
    <entry key="key1" value="Honda"/>
    <entry key="key2" value="Toyota"/>
</util:map>
```