ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Slim3入門

Slim3 Container、略してS3ContainerのDI部分は出来上がったので、機能を軽く紹介します。
まだ、サイトのデザインが決まってないので、サイト自体がないのですが、興味のある方は、https://www.slim3.org/svnリポジトリにアクセスすることで最新のソースを見ることができます。
はしもとさん、はやくSlim3のサイトの打ち合わせをしましょう。


S3Containerを動かすには、以下のjarファイルが必要です。

geronimo-xxxのjarファイルは、EJB3, JPA用のjarファイルです。アプリケーションサーバEJB3, JPAに対応しているなら不要です。
設定ファイルとして、slim3_configuration.propertiesをクラスパスの通っているディレクトリにおきます。中身はこんな感じ。


slim3.stage=test
slim3.deployment=hot
slim3.rootPackages=tutorial
java.naming.factory.initial=org.slim3.container.S3ContainerContextFactory
slim3.stageは今どのステージにいるのかを指定します。本番用は、productionです。それ以外は任意ですが、test, developmentを使うという想定でいます。RailsのENVと一緒ですね。
slim3.deploymentでHOT deploy(hot)なのかCOOL deploy(cool)なのかを指定します。Seasar2でいうWARM deployはなくなりました。実は、Slim3のCOOL deployは、Seasar2のWARM deployと同じなので、Seasar2のCOOL deployがなくなったというのが正しいです。
slim3.rootPackagesは、プロジェクトのルートになるパッケージを指定します。例えば、プロジェクトがxxx.action, xxx.service, xxx.entityなどのパッケージを持つ場合には、ルートパッケージはxxxになります。複数ある場合は、カンマで区切ります。
java.naming.factory.initialで、どのネーミングコンテキストを使うのかを指定します。指定しなかった場合は、アプリケーションサーバのネーミングコンテキストが使われます。
設定はこれだけ、簡単ですね。


それでは、アクションとサービスを作ってみましょう。


package tutorial.action;

@Stateless
public class AaaAction {
@EJB
protected BbbService bbbService;
...
}


package tutorial.service;

@Stateless
public class BbbService {
...
}

作成したEJBは、設定ファイルに登録する必要はありません。AaaActionを取得してみましょう。書くコードはこれだけ。

AaaAction action = Jndi.lookup("aaaAction");
EJB名を後ろから見て最初に大文字に出会うまでがEJBステレオタイプになります。今回の例だとAction。ルートパッケージにEJBステレオタイプの先頭を小文字にしたものを足し、EJB名の先頭を大文字にしたものがクラス名になります。aaaActionの場合だと、tutorial.action.AaaActionになります。
このような感じで、名前からクラスが特定できるので、後はアノテーションを読み取って、Beanを組み立てるわけです。
フィールド名をBean名にしたくないときには、@EJB(name = "Bean名")のようにname属性で指定します。
名前とクラスの規約は、自由にカスタマイズすることができます。


EJBではないオブジェクトは、@Resourceをつけて、プロパティに自動設定されるようにします。EJBではないオブジェクトには、UserTransactinやJdbcManagerなどがあります。


slim3_configuration.propertiesのエントリを@Resourceで設定することもできます。例えば、


app.hoge=aaa
のようなエントリがあった場合に、次のように書くとhogeプロパティにaaaが設定されます。

@Resource(name = "app.hoge")
protected String hoge;
プロパティが文字列以外の場合で、数値やbooleanの場合は、Slim3が自動的に変換します。
app.hogeのエントリの値をステージ(slim3.stage)がテストのときにはbbb、本番ではaaaに設定したいとします。その場合には、次のようにslim3_configuration.propertiesを書きます。

app.hoge=aaa
app.hoge_test=bbb
「エントリのキー_ステージ」のエントリがあると通常のエントリより優先されます。slim3.stageの値は、Systemのプロパティで上書きできます。実際は、slim3.stageだけではく、すべてのエントリがSystemのプロパティで上書きすることができます。


DIだけなら、覚えることはこれだけ。仕様もスリムでしょ。org.slim3.containerには、いまのところ12のクラスしかありません。AOPが入ってくるともう少しクラスは増えるでしょうが、30は超えない気がする。実装もスリムなのです。


S3Containerのソースコードは量が少なく直ぐに読める(Javadocは英語だけど)ので、ブラックボックス感がないところが意外と開発者にはうれしいと思う。開発者は、できればフレームワークの挙動を完全に把握して使いたいと思っているはず。