Spring+HibernateEntityManager(@Resource編)
今回は、前回の続きです。
@Resource アノテーションとは?
@Resource アノテーションは、クラス、メソッド、フィールドに対して指定可能なアノテーションで、リソースへの参照を宣言するためのものです。JSR 250: Common Annotations for the JavaTM Platform で定義されてるため、特定のフレームワークに依存しません。説明は、Common Annotations for the JavaTM PlatformTM Final Release の 2.3 javax.annotation.Resource に書かれています。ページ数は5ページ程度なので、ちょっと空いた時間を利用して読むのもアリかと。
SpringFramework 上での @Resource アノテーション
JSR-250 による定義では、@Resource の name 要素はリソースの JNDI 名です。しかし、SpringFramework のデフォルトの動作としては、bean 名を対象とします。未指定の場合は、フィールド名やメソッド名から導き出された名前を使用します。
前回のサンプル
これから @Resource アノテーションを、前回作成したサンプルに適用していきます。
まずは、前回作成したサンプルから、EntityManager に関する部分を抜粋したものを示します。
ServiceBase.java
/** * EntityManager */ private EntityManager entityManager; /** * EntityManager をセットします。 * * @param entityManager * EntityManager */ @Required public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; } /** * EntityManager を返します。 * * @return EntityManager */ public EntityManager getEntityManager() { return entityManager; }
beans.xml
<bean id="userService" class="domain.service.UserServiceImpl"> <lookup-method name="newUser" bean="user"/> <property name="entityManager" ref="entityManager"/> </bean>
変更前にリファクタしましょう。
@Resource アノテーションを適用する前に、現行ソースをリファクタします。サブクラスで、いちいち getEntityManager() とかやるのはめんどいので、フィールドを protected にして、getter メソッドを削除します。
ServiceBase.java(リファクタ後)
/** * EntityManager */ protected EntityManager entityManager; /** * EntityManager をセットします。 * * @param entityManager * EntityManager */ @Required public void setEntityManager(EntityManager entityManager) { this.entityManager = entityManager; }
ちょっとだけシンプルになりました。(`・ω・´)
変更前のソースのポイント
変更前のソースには、以下のようなポイントがあります。
UserServiceImpl.java
- 【長所】entityManager に値がセットされることを、@Required アノテーションにより保証する。
- 【短所】@Required アノテーションは、org.springframework.beans.factory.annotation パッケージに所属しているため、Spring Framework に依存している。
@Resource アノテーションを SpringFramework 上で使ってみる
それでは、現行のソースを、@Resource アノテーションを利用したソースに変更してみたいと思います。
UserServiceImpl.java
/** * EntityManager */ @Resource protected EntityManager entityManager;
setter メソッドをさっくりと削除しました。
以下のように1行で書いてもよさそうですね〜。
@Resource protected EntityManager entityManager;
beans.xml
<bean id="userService" class="domain.service.UserServiceImpl"> <lookup-method name="newUser" bean="user"/> </bean>
entityManager の DI 用途の1行が削除されました。
ソースがずいぶんシンプルになった ヽ( ・∀・)ノ ワーイ
@Resource アノテーションの効果
@Resource アノテーションを適用した際に注目すべき点考えてみます。
使いすぎは禁物?
ソースはシンプルになるかもしれませんが、Layered Architecture を破壊する可能性を秘めているような、、、。
今はちょっと思いつきませんが、DIの定義の都合で、ドメイン層のソースを書き換えるような事態が発生するような危険性ってないのかな?
思いついたら追記します o...rz
links
第1回 Spring+HibernateEntityManager(HibernateEntityManager単体編)
第2回 Spring+HibernateEntityManager(とりあえずSpring編)
第3回 Spring+HibernateEntityManager(宣言的トランザクション編)
第4回 Spring+HibernateEntityManager(Spring+DDDっぽく編)
第5回 Spring+HibernateEntityManager(Spring+DDDっぽく編 その2)
第6回 Spring+HibernateEntityManager(Spring+DDDっぽく編 その3)
第7回 Spring+HibernateEntityManager(Spring+DDDっぽく編 その4)
第8回 Spring+HibernateEntityManager(@Transactionalアノテーション編)
第9回 Spring+HibernateEntityManager(@Required編)
第10回 Spring+HibernateEntityManager(XMLからの外部リソース参照編)
第11回 Spring+HibernateEntityManager(AspectJ AOP with Load-Time-Weaver編)
第12回 Spring+HibernateEntityManager(DBCPのvalidationQuery編)
第13回 Spring+HibernateEntityManager(@Resource編)
第14回 Spring+HibernateEntityManager(コンポーネント自動検出 with アノテーション編)
第15回 Spring+HibernateEntityManager(コンポーネント自動検出 without アノテーション編)