Spring3でアノテーションを使って開発

Bean定義のXMLファイルがエラいこっちゃになってしまったり。 100個あるサービスクラスがインタフェース+Implな形にしてたら200以上になって、 Eclipseでパッケージ開いた時にイヤーンな事になってしまったり。 そういう苦い経験をしてきた人って多いと思うのですが、 これから開発するのにそういうのヤだなぁ的な。   ということで、、     XMLとインタフェース+Implを使う場合 手元の本やネットに転がってるサンプルを拝借して作ってたら、以下のようになった。   servlet-context.xml  このファイルはSTSでSpringMVCプロジェクトを作るとジェネレートされる。  DBの接続情報とかは以下のように書けて便利だけれども、

    <beans:bean id="dataSource"
        class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <beans:property name="driverClassName" value="com.mysql.jdbc.Driver" />
        <beans:property name="url" value="jdbc:mysql://localhost/spring" />
        <beans:property name="username" value="root" />
        <beans:property name="password" value="" />
    </beans:bean>

   コントローラーがサービスクラス呼んで~  サービスクラスがDaoクラス呼んで~  とかなるど、その依存をDIで解決させるために以下のようなbean定義をXMLに書くことになる

    ★ コントローラのbean定義&サービスクラスをインジェクション ★
    <beans:bean id="homeController" name="/" class="com.shinodogg.HomeController">
        <beans:property name="shopService" ref="shopService" />
    </beans:bean>
 
    ★ サービスクラスのbean定義&別サービスクラス(詳細情報取得)のインジェクション ★
    <beans:bean id="shopService" class="com.shinodogg.logic.ShopImpl">
        <beans:property name="itemCatalog" ref="itemCatalog" />
    </beans:bean>
 
    ★ 詳細情報用クラスのbean定義&Daoクラスをインジェクション ★
    <beans:bean id="itemCatalog" class="com.shinodogg.logic.ItemCatalogImpl">
        <beans:property name="itemDao" ref="itemDao" />
    </beans:bean>
 
    ★ Daoクラスのbean定義 ★
    <beans:bean id="itemDao" class="com.shinodogg.dao.ItemDaoImpl">
        <beans:property name="dataSource" ref="dataSource" />
    </beans:bean>

 コレ、プロジェクトが大きくなればなるほど、エライこっちゃになるかなと。。  扱うファイルは少なければ少ないほど好きなので、  細かくbean定義ファイルを分ける~とかも極力やりたくないです、と。   ・インタフェース+Implクラス  インタフェースを作って、

public interface Shop {
    List getItemList();
}

 Implクラス作って実装する、と。  コレによって、上記bean定義ファイルで、実装クラスを切り替える事ができます。  xxテストの時はxxとかっていう風にビルドする時に置き換えたりして。

public class ShopImpl implements Shop {
    private ItemCatalog itemCatalog;

    @Autowired(required=true)
    public void setItemCatalog(ItemCatalog itemCatalog) {
        this.itemCatalog = itemCatalog;
    }
    public List getItemList() {
        return this.itemCatalog.getItemList();
    }
}

 が、どんなクラス作るのに、毎回2ファイル作らなきゃいけないってのも  Eclipseでパッケージ開いた時に、上下にズドーンって長くなっちゃうのが嫌。  特定のミドルウエア使うクラスとか、外部接続するクラスとかで、  テストの時によって挿げ替えたいヤツがいれば、そいつだけやっとけばイイかな、と。。     XMLとインタフェース+Implを使わない場合 アノテーション使って以下のようにすればXMLにbean定義要らないし、 インタフェースにブラ下がってなくても直接そのクラスをsetterインジェクションできる   servlet-context.xml  コレといって。上記のDB接続定義とかくらい。   アノテーション  コントローラーでサービスクラスを使いたい時は @Autowired で以下のように。

    private Shop shop;
 
    @Autowired(required=true)
    public void setShop(Shop shop) {
        this.shop = shop;
    }

 サービスクラスやDaoクラスには @Service アノテーション付けとくと、  Tomcat起動時のログ的に以下のようにbean定義されてる事になるみたいです。  #どういう時にどのアノテーションとかってのがあんまりトレース出来てないのですが、、

 INFO : org.springframework.beans.factory.support.~略~
     dataSource,reportDataSource,shopService,itemCatalog,itemDao];
@Service
public class Shop {
    private ItemCatalog itemCatalog;

    @Autowired(required=true)
    public void setItemCatalog(ItemCatalog itemCatalog) {
        this.itemCatalog = itemCatalog;
    }
~略~

 サービスから先のDaoクラスまで @Autowired で上記のようにDI出来ます。  以下のように @Service アノテーション付けておく感じで。

@Service
public class ItemCatalog {
~略~
@Service
public class ItemDao {
    private SimpleJdbcTemplate template;
~略~

  ■ その他 privateなプロパティとsetter/getterしかないような バリューオブジェクトはEclipse君がジャカジャカやってくれますが、 この辺DDLとかから自動生成してくれるのとか、、きっと調べればありますよね。。 ふぅ、英語英語、とw  

Spring Recipes
Spring Recipes
posted with amazlet at 11.09.01
Gary Mak Josh Long Daniel Rubio
Apress
売り上げランキング: 7840