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