12. SpringFrameworkとの連携

DI(Depenency Injection) 機能のフレームワーク Spring Framework と連携できます。

Spring Frameworkのコンテナで管理可能、DI可能な部分は、次の箇所になります。

これらの機能・箇所は、 com.gh.mygreen.xlsmapper.BeanFactory によるインスタンスを新しく作成する箇所であり、その実装を com.gh.mygreen.xlsmapper.SpringBeanFactory に切り替え得ることで、DIを実現します。

表 - 12.1 Spring Frameworkとの連携可能な箇所

機能・箇所

説明

シートやレコードのインスタンス

TextFormatter の実装クラスがSpringBeanとして管理可能です。

独自のクラスタイプの対応方法

CellConverterFactory の実装クラスがSpringBeanとして管理可能です。

独自の表・セルのマッピング方法

FieldProcessor の実装クラスがSpringBeanとして管理可能です。

独自のリスナーの実装機能

リスナクラスがSpringBeanとして管理可能です。

独自のRecordFinderの実装機能

RecordFinder の実装クラスがSpringBeanとして管理可能です。

12.1. ライブラリの追加

Spring Frameworkを利用する際には、ライブリを追加します。 Mavenを利用している場合は、pom.xmlに以下を追加します。

Spring Frameworkのバージョンは、3.0以上を指定してください。

1<dependency>
2    <groupId>org.springframework</groupId>
3    <artifactId>spring-context</artifactId>
4    <version>4.3.2.RELEASE</version>
5</dependency>

12.2. XMLによるコンテナの設定

XMLによる設定方法を説明します。

コンテナの定義の基本は次のようになります。

  • アノテーションによるDIの有効化を行います。

  • コンポーネントスキャン対象のパッケージの指定を行います。

  • com.gh.mygreen.xlsmapper.SpringBeanFactory をSpringBeanとして登録します。

コード - 12.2.1 コンテナへの登録(XML形式)
 1<?xml version="1.0" encoding="UTF-8"?>
 2<beans xmlns="http://www.springframework.org/schema/beans"
 3    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 4    xmlns:aop="http://www.springframework.org/schema/aop"
 5    xmlns:tx="http://www.springframework.org/schema/tx"
 6    xmlns:context="http://www.springframework.org/schema/context"
 7    xsi:schemaLocation="http://www.springframework.org/schema/beans
 8        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
 9        http://www.springframework.org/schema/aop
10        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
11        http://www.springframework.org/schema/context
12        http://www.springframework.org/schema/context/spring-context-3.2.xsd
13    ">
14
15    <!-- アノテーションによるDIの有効化の定義 -->
16    <context:annotation-config />
17
18    <!-- コンポーネントスキャン対象のパッケージの指定 -->
19    <context:component-scan base-package="sample.spring" />
20
21    <!-- SpringBeanFactoryの登録 -->
22    <bean id="springBeanFactory" class="com.gh.mygreen.xlsmapper.SpringBeanFactory" />
23
24</beans>

12.3. JavaConfigによるコンテナの設定

Spring Framework3.0から追加された、JavaソースによるSpringBean定義の方法を説明します。

JavaConfigによる設定を使用する場合は、Spring Frameworkのバージョンをできるだけ最新のものを使用してください。 特に、機能が豊富なバージョン4.0以上の使用を推奨します。

コード - 12.3.1 JavaConfigの設定
 1import org.springframework.context.annotation.Bean;
 2import org.springframework.context.annotation.ComponentScan;
 3import org.springframework.context.annotation.Configuration;
 4import org.springframework.context.annotation.Description;
 5
 6import com.gh.mygreen.xlsmapper.SpringBeanFactory;
 7
 8// Javaによるコンテナの定義
 9@Configuration
10@ComponentScan(basePackages="sample.spring")
11public class XlsMapperConfig {
12
13    @Bean
14    @Description("Springのコンテナを経由するCSV用のBeanFactoryの定義")
15    public SpringBeanFactory springBeanFactory() {
16        return new SpringBeanFactory();
17    }
18
19}

12.4. SpringBeanとしての定義

ステレオタイプのアノテーション @Component/@Service/@Reposition/@Controller をサポートしているため、これらを使いSpringBeanを定義します。

シートクラスや、レコードクラスをSpringコンテナに登録する場合は、スコープは prototype にします。 ライフサイクル・コールバック用のアノテーションを付与したメソッド内でインジェクションしたクラスなどを呼び出したりします。

 1@Scope(BeanDefinition.SCOPE_PROTOTYPE)
 2@Component
 3@XlsSheet(name="Spring管理のBean")
 4public class SampleSheet {
 5
 6    /** SpringBeanをインジェクションする */
 7    @Autowired
 8    private SampleService sampleService;
 9
10    @XlsHorizontalRecords(tableLabel="一覧")
11    private List<SampleRecord> records;
12
13    /** 読み込み後に処理を実行する */
14    @XlsPostLoad
15    public void onLoad() {
16
17        sampleService.doService();
18
19    }

作成したSpringBeanFactoryをConfigurationに設定して、シートを読み込みます。

 1// 自作したSpringBeanFactory
 2@Autorired
 3SpringBeanFactory springBeanFacetory;
 4
 5public void doLoad() {
 6    // FacetoryBeanの実装を独自のものに変更する。
 7    Configuration config = new Configuration();
 8    config.setBeanFactory(springBeanFactory);
 9
10    XlsMapper mapper = new XlsMapper();
11    mapper.setConig(config);
12
13    SampleSheet sheet = mapper.load(...);
14}