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

SpringによるWebアプリケーションスーパーサンプル 第2版
株式会社クロノス 阪田 浩一
ソフトバンククリエイティブ
売り上げランキング: 8910

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

コメント

タイトルとURLをコピーしました