S2Container連携 <バージョン0.4.0の概要へ戻る>

SorMap Ver 0.4.0から、Javaの有名なDIコンテナであるs2-frameworkと連携できるようになりました。

これによって、SorMapのSQLインタフェースをDIコンテナから取得することができるほか
S2Containerのコンポーネント対象になっているクラスのフィールドにSQLインタフェース型を
用いることで、自動的にフィールドインジェクションを行うことができます。

S2Containerとの連携機能はSorMap本体ライブラリ(sormap-v.x.y.z.jar)とは別に
プラグインとして用意されております。

※注意
	S2Contaierと連携した場合、SQLインタフェースで使われるJDBCコネクションは
	S2Containerの管理外となります。
	
	SQLインタフェースにてS2Containerが管理するコネクションを用いることはできません。
	これを実現する機能は、次期バージョンにて追加予定です。

S2Containerとの連携を行いたい場合は、S2Container連携用ライブラリを別途クラスパスに
含めてください。



S2Containerとの連携方法(1) creator.diconの修正

SorMapとS2Containerを連携するためには、まずs2-frameworkからSorMapのSQLインタフェースを
認識できるようにする必要があります。

これらを実現するために、SorMapのS2Containerプラグインでは、専用のカスタムクリエータが
用意されております。

まず、creator.diconを以下のように修正してください
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
  3. "http://www.seasar.org/dtd/components24.dtd">
  4. <components>
  5. <!-- ↓↓↓ここから 既存の定義↓↓↓ -->
  6. <include path="convention.dicon"/>
  7. <include path="customizer.dicon"/>
  8. <component class="org.seasar.framework.container.creator.ActionCreator"/>
  9. <!--<component class="org.seasar.struts.creator.FormCreator"/>-->
  10. <component class="org.seasar.framework.container.creator.ServiceCreator"/>
  11. <component class="org.seasar.framework.container.creator.DtoCreator"/>
  12. <component class="org.seasar.framework.container.creator.InterceptorCreator"/>
  13. <component class="org.seasar.framework.container.creator.DaoCreator"/>
  14. <!-- ↑↑↑ここまで 既存の定義↑↑↑ -->
  15. <!-- ↓↓↓ここから SorMap用定義↓↓↓ -->
  16. <!-- SorMap SQLInterface -->
  17. <component class="org.dyndns.nuda.mapper.s2.SQLInterfaceCreator"/>
  18. <!-- ↑↑↑ここまで SorMap用定義↑↑↑ -->
  19. </components>
カスタムクリエータとして"org.dyndns.nuda.mapper.s2.SQLInterfaceCreator"をcreator.diconに
追加定義することで、S2ContainerがSorMapを認識できるようになります。

S2Containerとの連携方法(2) SQLインタフェースの名称とアノテーション

S2Containerが認識できるSQLインタフェースは何でもよいわけではありません。

次に、SQLインタフェースの要件を記載します
(1) SQLインタフェースのサフィックスが"SqlIF"であること
(2) SQLインタフェースの定義に"S2Component"アノテーションが付与されていること

上記2点を満たしたインタフェースは、S2ContainerからSQLインタフェースとして認識
できます。

以下サンプルをご覧ください。
  1. package test.dao;
  2. import java.util.List;
  3. import org.dyndns.nuda.mapper.s2.S2Component;
  4. import test.CityVo;
  5. import test.CountryVo;
  6. @S2Component
  7. public interface CitySqlIF {
  8. public List<CityVo> select();
  9. public CityVo selectById(CityVo vo);
  10. public List<CountryVo> selectAllCountry();
  11. }
上記のように定義することで、以下のようなコードでSQLインタフェースをS2Containerから取得できます。
  1. package dousa_test.v3;
  2. import java.util.List;
  3. import org.dyndns.nuda.logger.CommonLogger;
  4. import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
  5. import test.CountryVo;
  6. import test.dao.CitySqlIF;
  7. public class SeaserTest {
  8. /**
  9. * @param args
  10. */
  11. public static void main(final String[] args) {
  12. // s2-frameworkのコンテナを初期化
  13. SingletonS2ContainerFactory.init();
  14. // S2ContainerよりSQLインタフェースを取得
  15. CitySqlIF intf =
  16. (CitySqlIF) SingletonS2ContainerFactory
  17. .getContainer()
  18. .getComponent("CitySqlIF");
  19. // クエリを実行
  20. List<CountryVo> result = intf.selectAllCountry();
  21. for (CountryVo vo : result) {
  22. CommonLogger
  23. .getLoggerAdaptor()
  24. .getLogger(SeaserTest.class)
  25. .info("{}", vo);
  26. }
  27. }
  28. }
上記コードを実行することで、例えばコンソールには以下のように
表示されます

※conversion.diconにてルートパッケージが指定されている場合は
	ルートパッケージ.dao
パッケージ配下にSQLインタフェースを格納してください。

ルートパッケージの指定が無い場合は名前を用いたコンポーネントの取得は
行えません。
log4j:INFO Using URL [file:/D:/workspace/SorMap/bin-resources/log4j.xml] for automatic log4j configuration of repository named [default].
2014/06/08 02:59:34,375 INFO  org.seasar.framework.container.factory.SingletonS2ContainerFactory                         - s2-frameworkのバージョンは2.4.47です。
2014/06/08 02:59:34,377 INFO  org.seasar.framework.container.factory.SingletonS2ContainerFactory                         - s2-extensionのバージョンは2.4.47です。
2014/06/08 02:59:35,501 INFO  JDBC-Container                                                                             - JDBCXMLInvocationHandler(Connection, Class<?>, ClassLoader, boolean, boolean):org.dyndns.nuda.mapper.connection.SQLInterfaceConnection@3d860038, interface test.dao.CitySqlIF, sun.misc.Launcher$AppClassLoader@69cd2e5f, false, false
2014/06/08 02:59:35,503 INFO  JDBC-Container                                                                             - initContainer(Connection, Class<?>, ClassLoader, boolean, boolean):org.dyndns.nuda.mapper.connection.SQLInterfaceConnection@3d860038, interface test.dao.CitySqlIF, sun.misc.Launcher$AppClassLoader@69cd2e5f, false, false
2014/06/08 02:59:35,510 INFO  JDBC-Container                                                                             - initSQLIFCtrlCommand(void):
2014/06/08 02:59:35,553 INFO  org.seasar.framework.container.factory.SingletonS2ContainerFactory                         - Running on [ENV]ct, [DEPLOY MODE]Hot Deploy
2014/06/08 02:59:35,575 INFO  JDBC-Container                                                                             - JDBCXMLInvocationHandler(Connection, Class<?>, ClassLoader, boolean, boolean):org.dyndns.nuda.mapper.connection.SQLInterfaceConnection@583a5794, interface test.dao.CitySqlIF, sun.misc.Launcher$AppClassLoader@69cd2e5f, false, false
2014/06/08 02:59:35,576 INFO  JDBC-Container                                                                             - initContainer(Connection, Class<?>, ClassLoader, boolean, boolean):org.dyndns.nuda.mapper.connection.SQLInterfaceConnection@583a5794, interface test.dao.CitySqlIF, sun.misc.Launcher$AppClassLoader@69cd2e5f, false, false
2014/06/08 02:59:35,582 INFO  JDBC-Container                                                                             - initSQLIFCtrlCommand(void):
2014/06/08 02:59:35,589 INFO  JDBC-Container                                                                             - invoke(Object, Method, Object):SQLInterface<X>, selectAllCountry, argument<X>
2014/06/08 02:59:35,711 INFO  dousa_test.v3.SeaserTest                                                                   - [CountryVo: code: ABW name: Aruba continent: North America region: Caribbean surfacearea: 0.0 indepyear: 0 population: 103000 lifeexpectancy: 0.0 gnp: 0.0 gnpold: 0.0 localname: Aruba governmentform: Nonmetropolitan Territory of The Netherlands headofstate: Beatrix capital: 129 code2: AW]
2014/06/08 02:59:35,712 INFO  dousa_test.v3.SeaserTest                                                                   - [CountryVo: code: AFG name: Afghanistan continent: Asia region: Southern and Central Asia surfacearea: 0.0 indepyear: 0 population: 22720000 lifeexpectancy: 0.0 gnp: 0.0 gnpold: 0.0 localname: Afganistan/Afqanestan governmentform: Islamic Emirate headofstate: Mohammad Omar capital: 1 code2: AF]
2014/06/08 02:59:35,713 INFO  dousa_test.v3.SeaserTest                                                                   - [CountryVo: code: AGO name: Angola continent: Africa region: Central Africa surfacearea: 0.0 indepyear: 0 population: 12878000 lifeexpectancy: 0.0 gnp: 0.0 gnpold: 0.0 localname: Angola governmentform: Republic headofstate: José Eduardo dos Santos capital: 56 code2: AO]
2014/06/08 02:59:35,714 INFO  dousa_test.v3.SeaserTest                                                                   - [CountryVo: code: AIA name: Anguilla continent: North America region: Caribbean surfacearea: 0.0 indepyear: 0 population: 8000 lifeexpectancy: 0.0 gnp: 0.0 gnpold: 0.0 localname: Anguilla governmentform: Dependent Territory of the UK headofstate: Elisabeth II capital: 62 code2: AI]
2014/06/08 02:59:35,714 INFO  dousa_test.v3.SeaserTest                                                                   - [CountryVo: code: ALB name: Albania continent: Europe region: Southern Europe surfacearea: 0.0 indepyear: 0 population: 3401200 lifeexpectancy: 0.0 gnp: 0.0 gnpold: 0.0 localname: Shqipëria governmentform: Republic headofstate: Rexhep Mejdani capital: 34 code2: AL]
2014/06/08 02:59:35,715 INFO  dousa_test.v3.SeaserTest                                                                   - [CountryVo: code: AND name: Andorra continent: Europe region: Southern Europe surfacearea: 0.0 indepyear: 0 population: 78000 lifeexpectancy: 0.0 gnp: 0.0 gnpold: 0.0 localname: Andorra governmentform: Parliamentary Coprincipality headofstate:  capital: 55 code2: AD]
2014/06/08 02:59:35,716 INFO  dousa_test.v3.SeaserTest                                                                   - [CountryVo: code: ANT name: Netherlands Antilles continent: North America region: Caribbean surfacearea: 0.0 indepyear: 0 population: 217000 lifeexpectancy: 0.0 gnp: 0.0 gnpold: 0.0 localname: Nederlandse Antillen governmentform: Nonmetropolitan Territory of The Netherlands headofstate: Beatrix capital: 33 code2: AN]
2014/06/08 02:59:35,716 INFO  dousa_test.v3.SeaserTest                                                                   - [CountryVo: code: ARE name: United Arab Emirates continent: Asia region: Middle East surfacearea: 0.0 indepyear: 0 population: 2441000 lifeexpectancy: 0.0 gnp: 0.0 gnpold: 0.0 localname: Al-Imarat al-´Arabiya al-Muttahida governmentform: Emirate Federation headofstate: Zayid bin Sultan al-Nahayan capital: 65 code2: AE]
--- ここから下は省略 ---
また、以下のようなs2-frameworkのコンポーネントを作成することで
"intf"フィールドにSQLインタフェースがフィールドインジェクションされます。
  1. package test.action;
  2. import org.dyndns.nuda.profile.ProfilerRepository;
  3. import test.CityVo;
  4. import test.dao.CitySqlIF;
  5. /**
  6. * s2-frameworkで管理されるコンポーネントの例
  7. *
  8. * @author nkoseki
  9. *
  10. */
  11. public class SampleAction {
  12. /**
  13. * SQLインタフェースがオートバインディングされるフィールド
  14. * (s2-framework v2.4系のオートバインディングを用いるために、publicとする)
  15. */
  16. public CitySqlIF intf;
  17. /**
  18. * サンプルメソッド
  19. *
  20. * @return
  21. */
  22. public String test() {
  23. ProfilerRepository.reserveProfiler();
  24. this.intf.selectById(new CityVo(100));
  25. return "";
  26. }
  27. }