cafegale(LeafCage備忘録)

LeafCage備忘録(はてなダイアリー)と統一しました。

Seasar2覚書

プロジェクトの作成はDoltengから

ドゥルテン
Webアプリケーションでなければ、「スタンドアロン」にして

ルートパッケージ下のファイルがHot Deployなどされるらしい
ルートパッケージはconvention.diconで設定されている。org.seasar.framework.convention.impl.NamingConventionImpl#addRootPackageName()で。
以下のファイルが自動でdeploy対象になる(SMART deploy)

命名規則 コンポーネントのライフサイクル 説明
ルートパッケージ.action.*Action request SAStrutsのアクションクラス
ルートパッケージ.form.*Form request SAStrutsのアクションフォーム
ルートパッケージ.dao.*Dao prototype DAO
ルートパッケージ.dto.*Dto request DTO
ルートパッケージ.interceptor.*Interceptor prototype インターセプター
ルートパッケージ.service.*Service prototype サービスクラス

この設定はcreator.diconによって決定されているらしい

Kijimuna

Eclipse上でプロジェクトを右クリック→プロパティ→Kijimuna設定ページで[Seasar2プロジェクト]にチェック、[プロジェクト固有の設定を有効にする]にチェック→[自動インジェクションでnullが設定される場合]をIgnoreに設定

基本メソッド

普通はSingletonS2COntainerFactory, SingletonS2Container

S2ContainerFactory
#setConfigPath("sample/my.dicon")
デフォルトapp.diconから変更したいとき
#init()
コンテナの初期化 (singletonのコンポネントも初期化) webアプリの場合はS2ContainerServletが自動的に呼び出すので、明示的に呼び出す必要はない
#destoroy()
コンテナの廃棄
S2Container
#getComponent({foo.class or "論理名"})
指定した[クラス/インターフェイス]の[継承クラス/実装クラス]をS2Containerから探してきて注入する(初期化)。候補が複数ある場合はTooManyRegistrationRuntimeException
S2Container container = S2ContainerFactory.create("hello.dicon");
Greeting greeting = (Greeting) container.getComponent(sample3.Greeting.class);

この場合、container設計元diconである"hello.dicon"からsample3.Greeting.classの[実装/継承]クラスを探してきて注入する。一意に定まらなければエラー。

diconファイル

    • namespace
    • initializeOnCreate
      • 既定false コンテナ生成時にコンテナを初期化するかどうか
  • name
    • name="messageTarget"。注入に論理名を使用したいとき(クラスを指定したときそれを継承/実装する候補が複数あって一意に定まらないとき利用)。
  • class(必須)
    • class="test.helloworld.SeasarMessageTarget"
  • instance
    • ライフサイクル singleton(使い回し) prototype(使い捨て・常に新) request session application outer(特別なコンポネント)
    • request session applicationはwebアプリケーションのみ。自分より寿命の短いコンポネントはDIできない*1
    • (寿命が長くなるほどスレッドセーフでなくなる*2危険性)
  • autoBinding
    • 自動インジェクション auto semiauto constructor property none
  • externalBinding
    • 鄯.S2ContainerがDIするコンポネントを自動的に判別できないときに使う
      • messageTarget
    • 鄱.セッターインジェクションで渡す引数を指定する
    • コンストラクタインジェクションで渡す引数を指定(複数の引数のときは順番に注意)
    • 初期化時に呼び出されるメソッド名 (メソッドインジェクション) 与数
    • 廃棄時に呼び出されるメソッド名。singletonのみ有効
    • このコンポネントに適用するインターセプター名 loggingInterceptor
    • pointcut
      • 指定した名前のメソッドにのみインターセプター適用(カンマ区切りで複数選択可)

diconファイルを複数に分割する
親からは子を参照できるが、子からは親を参照不可能

  • path
  • condition
    • インクルード条件。OGNL式を記述し、trueならインクルードする

diconファイルのインクルード方法

1. タグを使う
2. SimplePathResolverのaddRealPath()でリマップする

<component class="org.seasar.framework.container.factory.SimplePathResolver">
  <initMethod name="addRealPath">
    <arg>"from.dicon"</arg>
    <arg>"to.dicon"</arg>
  </initMethod>
</component>

3. XIncludeを利用する (タグなので注意) との違いは、その場で読み込まれること(依存関係に気を払わなくていい)

<components xmlns:xi="http://www.w3.org/2001/XInclude">
  <xi:include href="/foo.dicon"/>
  <xi:include href="/bar.dicon"/>
</components>

環境によるdiconファイル切り替え

クラスパスルートにenv.txtを置き、以下の環境名のうちのどれかを記述

環境名 説明 Doltengプロジェクトでは
ut 単体テスト環境 WARM deploy
ct 結合テスト HOT deploy
it 統合テスト COOL deploy
product 運用環境(既定) COOL deploy

diconファイル名をapp_ut.diconのように「_環境名」にすると自動でそれを利用するようになる。
また、diconファイル内で#ENVという変数で環境名を参照可能
Javaコード内ではorg.seasar.framework.env.Env#getValue()から現環境名を、
org.seasar.framework.env.Env.UTなどからutなどの環境名を取得可能。
org.seasar.framework.container.util.SmartDeployUtil.isHotdeployMode({コンテナ})でコンテナがHot deployモードかどうかを判定できる。

*1:DIする=DIでnewする的な

*2:更新の最中に別の所から値を変更されてしまう的な