Spring2.5のアノテーションでDIの設定をする

今まではBean定義ファイルに

<bean id="userLogic" class="com.master.of.taka.UserLogic">
    <property name="userDAO"><ref local="userDAO"/></property>
</bean>

と言う感じで設定を書いていたが意外とめんどくさい。
というわけでアノテーションで設定を書いてみる

@Service("userLogic")
public class UserLogicImpl implements UserLogic{
   @Autowired
   private UserDAO userDAO;
   
   @Override
   public User find() {
      //処理を書く
   }

}

@Repository("userDAO")
public class UserDAOImpl implements UserDAO{
   public User find(){
      //処理を書く
   }
}

//Logic呼び出し元
UserLogic logic = context.getBean("userLogic");

Bean定義ファイル

<!-- アノテーションを付与したBeanを読み込む設定 -->
<!-- パッケージを指定。カンマ区切りで複数指定できる -->
<context:component-scan base-package="master.of.taka.dao,master.of.taka.logic"/>

これでUserLogicImplのプロパティUserDTOにUserDAOImplがインジェクトされて取得できる

テストをするときなどにテスト用モックオブジェクトを使用したい場合は@Autowiredを付与したプロパティに@Qualifier("userMockDao")と名前を指定することで、同じインターフェースを実装するクラスがクラスパス内に複数存在した場合でも正しくインジェクトされる。

でもソースコードをいちいちいじるのが面倒だという場合はBean定義ファイルの読み込みパッケージの指定を書き換えてモック用のクラスのみ読み込むようにするだけでOK。むしろこっちの方が便利。

そのほかのアノテーション

//現状@Serviceを付与した場合と変わりはない
//サービス層のクラスには@Serviceなのかな?
@Component

//よくわからないので調べる
@Controller

//こんな設定もある。意味はきっとそのまま
@Autowired(required=true)

調べたらもっと色々あるのかなぁ。javadocでも見てみるか。

springに限らずDI使い始めちゃうともうやめられない気がする。しかもアノテーションで設定が出来るなんてすばらしいねぇ。


以上。