CommonTools (V0.4.1b) | 2014-06-06 23:24 |
sormap (V0.4.0.0) | 2014-06-06 23:13 |
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連携用ライブラリを別途クラスパスに 含めてください。
SorMapとS2Containerを連携するためには、まずs2-frameworkからSorMapのSQLインタフェースを 認識できるようにする必要があります。 これらを実現するために、SorMapのS2Containerプラグインでは、専用のカスタムクリエータが 用意されております。 まず、creator.diconを以下のように修正してください
- <?xml version="1.0" encoding="UTF-8"?>
- <!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN"
- "http://www.seasar.org/dtd/components24.dtd">
- <components>
- <!-- ↓↓↓ここから 既存の定義↓↓↓ -->
- <include path="convention.dicon"/>
- <include path="customizer.dicon"/>
- <component class="org.seasar.framework.container.creator.ActionCreator"/>
- <!--<component class="org.seasar.struts.creator.FormCreator"/>-->
- <component class="org.seasar.framework.container.creator.ServiceCreator"/>
- <component class="org.seasar.framework.container.creator.DtoCreator"/>
- <component class="org.seasar.framework.container.creator.InterceptorCreator"/>
- <component class="org.seasar.framework.container.creator.DaoCreator"/>
- <!-- ↑↑↑ここまで 既存の定義↑↑↑ -->
- <!-- ↓↓↓ここから SorMap用定義↓↓↓ -->
- <!-- SorMap SQLInterface -->
- <component class="org.dyndns.nuda.mapper.s2.SQLInterfaceCreator"/>
- <!-- ↑↑↑ここまで SorMap用定義↑↑↑ -->
- </components>
カスタムクリエータとして"org.dyndns.nuda.mapper.s2.SQLInterfaceCreator"をcreator.diconに 追加定義することで、S2ContainerがSorMapを認識できるようになります。
S2Containerが認識できるSQLインタフェースは何でもよいわけではありません。 次に、SQLインタフェースの要件を記載します (1) SQLインタフェースのサフィックスが"SqlIF"であること (2) SQLインタフェースの定義に"S2Component"アノテーションが付与されていること 上記2点を満たしたインタフェースは、S2ContainerからSQLインタフェースとして認識 できます。 以下サンプルをご覧ください。
上記のように定義することで、以下のようなコードでSQLインタフェースをS2Containerから取得できます。
- package dousa_test.v3;
- import java.util.List;
- import org.dyndns.nuda.logger.CommonLogger;
- import org.seasar.framework.container.factory.SingletonS2ContainerFactory;
- import test.CountryVo;
- import test.dao.CitySqlIF;
- public class SeaserTest {
- /**
- * @param args
- */
- public static void main(final String[] args) {
- // s2-frameworkのコンテナを初期化
- SingletonS2ContainerFactory.init();
- // S2ContainerよりSQLインタフェースを取得
- CitySqlIF intf =
- (CitySqlIF) SingletonS2ContainerFactory
- .getContainer()
- .getComponent("CitySqlIF");
- // クエリを実行
- List<CountryVo> result = intf.selectAllCountry();
- for (CountryVo vo : result) {
- CommonLogger
- .getLoggerAdaptor()
- .getLogger(SeaserTest.class)
- .info("{}", vo);
- }
- }
- }
上記コードを実行することで、例えばコンソールには以下のように 表示されます ※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インタフェースがフィールドインジェクションされます。
- package test.action;
- import org.dyndns.nuda.profile.ProfilerRepository;
- import test.CityVo;
- import test.dao.CitySqlIF;
- /**
- * s2-frameworkで管理されるコンポーネントの例
- *
- * @author nkoseki
- *
- */
- public class SampleAction {
- /**
- * SQLインタフェースがオートバインディングされるフィールド
- * (s2-framework v2.4系のオートバインディングを用いるために、publicとする)
- */
- public CitySqlIF intf;
- /**
- * サンプルメソッド
- *
- * @return
- */
- public String test() {
- ProfilerRepository.reserveProfiler();
- this.intf.selectById(new CityVo(100));
- return "";
- }
- }