ソフトバンククリエイティブ
売り上げランキング: 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
Apress
売り上げランキング: 7840
コメント