12. SpringFrameworkとの連携
DI(Depenency Injection) 機能のフレームワーク Spring Framework と連携できます。
Spring Frameworkのコンテナで管理可能、DI可能な部分は、次の箇所になります。
これらの機能・箇所は、 com.gh.mygreen.xlsmapper.BeanFactory
によるインスタンスを新しく作成する箇所であり、その実装を com.gh.mygreen.xlsmapper.SpringBeanFactory
に切り替え得ることで、DIを実現します。
機能・箇所 |
説明 |
---|---|
シートやレコードのインスタンス |
|
|
|
|
|
リスナクラスが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として登録します。
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以上の使用を推奨します。
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}