#play_jaの12月23日の記事になります。Moduleなるものがあります。これによってPlay!でもSpringFrameworkを使うことが可能になります。Springを使うことのメリットとしては、それなりに大規模な開発において、インタフェースクラスを確実にきって、責務の所在を明らかにした実装を行うケースかと思います。Springを使うことでフィールドに依存ロジックをhaveする実装になり、外部から依存ロジックを注入可能になることで結果的にテスタビリティが上がるので個人的に好きだったりします。そもそもPlay!が「そういう面倒なことしなくていいから、ささっと作って動かして確認してしまおうよ」という思想なのは百も承知ですが、AdventCalendarネタがかぶりまくってネタに困っているので、最後の手段でSpringModuleに手を出したわけでPlay!とSpringでなんかできないかなぁと思い試しに使ってみましたので、その情報を共有させていただきます。以下のような利用シーンはどうでしょうか。・対外システム接続があり、外部への接続モジュールはスタブと容易に差し替えを可能にしておきたい場合Springモジュールのインストールではやってみましょう。1.0.2するとPlay!のフォルダ配下のmodulesにspring-1.0.2が入ります。そこで、気になるのがSpringのバージョンです。playルート/modules/spring-1.0.2/lib/META-INF/MANIFEST.MFで中のjarのバージョンを確認してみます。:どうやら、Springは2.5系統が組み込まれているようです。最新のSpringは3ですね。3にバージョンアップしてしまいましょう。やり方は簡単で、playルート/modules/spring-1.0.2/lib/配下のSpring関連のjarを最新のSpringのjarに入れ替えればよいです。このlibフォルダにはplay実行時にクラスパスが張られるため、jarのファイル名等は気にしなくて問題ありません。spring-beans.jarspring-context.jarspring-core.jar元々入っていた上記のjarを以下に置き換えました。aopalliance-1.0.jarasm-3.1.jaraspectjweaver.jarorg.springframework.aop-3.0.4.RELEASE.jarorg.springframework.asm-3.0.4.RELEASE.jarorg.springframework.aspects-3.0.4.RELEASE.jarorg.springframework.beans-3.0.4.RELEASE.jarorg.springframework.context-3.0.4.RELEASE.jarorg.springframework.context.support-3.0.4.RELEASE.jarorg.springframework.core-3.0.4.RELEASE.jarorg.springframework.expression-3.0.4.RELEASE.jarorg.springframework.instrument-3.0.4.RELEASE.jarorg.springframework.instrument.tomcat-3.0.4.RELEASE.jarorg.springframework.jdbc-3.0.4.RELEASE.jarorg.springframework.jms-3.0.4.RELEASE.jarorg.springframework.orm-3.0.4.RELEASE.jarorg.springframework.oxm-3.0.4.RELEASE.jarorg.springframework.test-3.0.4.RELEASE.jarorg.springframework.transaction-3.0.4.RELEASE.jarorg.springframework.web-3.0.4.RELEASE.jarorg.springframework.web.portlet-3.0.4.RELEASE.jarorg.springframework.web.servlet-3.0.4.RELEASE.jarorg.springframework.web.struts-3.0.4.RELEASE.jarSpringのリビジョンがやや古いのは気にしないで下さい。手元にあった一式がこれだったので。これで、晴れてSpring3.xの機能が使えるようになります。ControllerにBeanをインジェクションでは、試しに何か適当に実行してみましょう。確認としてApplicationクラス(Controller)に対して、Twitterに接続するためのクラスTwitterAccessor(実装はTwitterAccessorImpl)をインジェクションしてみます。@Injectアノテーションをつけることで、application-context.xmlに定義したbeanが自動的にインジェクションされます。Applicationクラスは以下の通り。{System.out.println("tweet!");}}実行結果は以下になります。tweet!正しくApplicationクラスにTwitterAccessorImplがインジェクションされていることがわかります。SpringのAOPを動作させるインジェクションが実現出来るとSpring使い的に次ぎにやりたくなるのがAOPです。そこで、AOP確認用に以下のクラスを用意します。単純にメソッドの実行の前後にログを出力するだけのインターセプターです。ret;}}application-context.xmlには以下を追記します。TwitterAccessorImplの何らかのメソッドがコールされるタイミングでAOPによるLoggingInterceptorを差し込みます。/></aop:config>実行結果は以下です。tweet!実は、@InjectではAOPによるProxyクラスを経由したオブジェクトがインジェクションされるのではなく、そのままのインジェクションになります。そのため、@Injectでは、AOPは効きません。そこで別の方法でBeanを取得してみます。Play!のSpringモジュールにはSpringクラスというものがあります。message);renderJSON(result);}}実行結果は以下です。tweet!しょうがないので、Play!のSpringモジュール内のクラス経由でApplicationContextにアクセスするのではなく、純粋にApplicationContextをインスタンス化して、そこから取り出すことにしました。これなら確実に出来るはず。message);}}実行結果は以下になります。想定通りAOPによるログ出力処理が実行出来ました。>>>>>proccess_finished@InjectでSpringのAOPを動作させる(未動作確認)@InjectでAOPをかけることが出来ないか調べてみました。実際に実行して試してはいないのですが、多分いけると思うのでメモとして残しておきます。SpringモジュールにはSpringPluginというクラスがあります。契機で処理を実行できます。SpringPluginではアプリケーション起動時の最後にInjector.inject(this);という処理をコールしています。}}Injectorは以下になります。やっていることは各フィールドをリフレクションでアノテーションを取得し、Injectアノテーションの場合は、SpringPluginのgetBeanOfType()をコールするだけです。}}つまり、SpringPluginのgetBeanOfTypeメソッドをオーバーライドして型ベースではなくBeanIdをもとにgetBeanするように修正すれば、@InjectでAOPを効かせることも可能だと思われます。MyBatis連携Spring3が動くようになったついでに、MyBatisも組み込んでみようと思い試してみました。MybatisジェネレータでデータベースからORMapperを自動生成して、Spring-Mybatis連携モジュールを使って、正常に動作しました。Play!でSpring3が動けばあとは単純にSpringとMyBatisの連携をするだけなので、従来通りのやり方で可能でした。・Play!でもSpringが最新バージョンで動く・@InjectそのままではAOPは効かないけど、やりようによってはAOPもかけれる・MyBatisも使えるよ次は@hina0118さんです。ツイートはてなブログをはじめよう!i2keyさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。