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 2 3 4 5 | <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.2.RELEASE</version>
</dependency>
|
12.2. XMLによるコンテナの設定¶
XMLによる設定方法を説明します。
コンテナの定義の基本は次のようになります。
アノテーションによるDIの有効化を行います。
コンポーネントスキャン対象のパッケージの指定を行います。
com.gh.mygreen.xlsmapper.SpringBeanFactory
をSpringBeanとして登録します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
">
<!-- アノテーションによるDIの有効化の定義 -->
<context:annotation-config />
<!-- コンポーネントスキャン対象のパッケージの指定 -->
<context:component-scan base-package="sample.spring" />
<!-- SpringBeanFactoryの登録 -->
<bean id="springBeanFactory" class="com.gh.mygreen.xlsmapper.SpringBeanFactory" />
</beans>
|
12.3. JavaConfigによるコンテナの設定¶
Spring Framework3.0から追加された、JavaソースによるSpringBean定義の方法を説明します。
JavaConfigによる設定を使用する場合は、Spring Frameworkのバージョンをできるだけ最新のものを使用してください。 特に、機能が豊富なバージョン4.0以上の使用を推奨します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Description;
import com.gh.mygreen.xlsmapper.SpringBeanFactory;
// Javaによるコンテナの定義
@Configuration
@ComponentScan(basePackages="sample.spring")
public class XlsMapperConfig {
@Bean
@Description("Springのコンテナを経由するCSV用のBeanFactoryの定義")
public SpringBeanFactory springBeanFactory() {
return new SpringBeanFactory();
}
}
|
12.4. SpringBeanとしての定義¶
ステレオタイプのアノテーション @Component/@Service/@Reposition/@Controller
をサポートしているため、これらを使いSpringBeanを定義します。
シートクラスや、レコードクラスをSpringコンテナに登録する場合は、スコープは prototype にします。 ライフサイクル・コールバック用のアノテーションを付与したメソッド内でインジェクションしたクラスなどを呼び出したりします。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | @Scope(BeanDefinition.SCOPE_PROTOTYPE)
@Component
@XlsSheet(name="Spring管理のBean")
public class SampleSheet {
/** SpringBeanをインジェクションする */
@Autowired
private SampleService sampleService;
@XlsHorizontalRecords(tableLabel="一覧")
private List<SampleRecord> records;
/** 読み込み後に処理を実行する */
@XlsPostLoad
public void onLoad() {
sampleService.doService();
}
|
作成したSpringBeanFactoryをConfigurationに設定して、シートを読み込みます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | // 自作したSpringBeanFactory
@Autorired
SpringBeanFactory springBeanFacetory;
public void doLoad() {
// FacetoryBeanの実装を独自のものに変更する。
Configuration config = new Configuration();
config.setBeanFactory(springBeanFactory);
XlsMapper mapper = new XlsMapper();
mapper.setConig(config);
SampleSheet sheet = mapper.load(...);
}
|