Spring Framework2.1-M1 Annotation-Driven

ブログみながらやってみましたよ。
これはできるようになるといいかもしれん。
Contextファイル書くのは簡単だけど、同じような記述が大量だった2.0にくらべてこれはキレイに。
S2みたく全くの記述レスていうわけじゃないけど。
これはこれでわかりやすいかも。


  
  
  
  
  
  
    
  
    
    
    
    
  

こんな感じになるらしい。
AOPにデータベース使わない、ただのBeanにinjectionするだけなら


このcontextスキーマのcomponent-scanで起動時に読み込む模様。
実際log4jでログだしてみたら結構えぐいことやってそう^^;
解決するクラス数が増えたときのパフォーマンスはどうなるのやら。
これは誰かがやるでしょう。S2vsSpringとか好きらしいのでw
話戻して。
base-package属性に書いたパッケージにあるクラスを対象にするみたいね。
で、Springで管理したいBeanには「@Component」アノテーションか、「@Repository」アノテーションを付けると。
ComponentはServiceクラスとかで、RepositoryはDAOクラスに付けるらしい。

@Component
public class GreetingServiceImpl implements GreetingService {
}

@Repository
public class JdbcMessageRepository implements MessageRepository {
}

んで、injectionしたいやつは「@Autowired」アノテーションをフィールドorセッターに付けると。
Autowiredがあると、Springのほうで対象のパッケージ内からクラスの型をみて解決してくれるっぽい。
HogeServiceの実装クラスが二つ、おなじパッケージ内にあった場合は想像通り例外発生。
そらそうだわな。
あと、セッターにアノテーションを付けた場合、パラメータの型だけみてるぽくてメソッド名とあってなくてもいいっぽい?

  @Autowired
  public void createTemplate(DataSource dataSource) {
    this.jdbcTemplate = new SimpleJdbcTemplate(dataSource);
  }

サンプルに↑の例もあってこれちゃんとDataSourceの実装クラスがinjectionされたし。
あとは「@PostConstruct」と「@PreDestroy」のアノテーション。(追記:これJavaEE5/JavaSE6だかで追加されたものだった)
初期化と後処理として実行したいメソッドに付けるだけ。
2.0でInitializingBean(だったけ?)インタフェースを付けないとできなかったやつ。
(これはPostConstractだけかな?)


2.0でTransactionがアノテーションベースで記述できるようになって、2.1ではAOPが。
Bean定義も最小で済みそうだし。
いままでの肥大化から解放されそう。
ちゅーてもやっぱGUIは必要そうだし。Spring2.1リリースにあわせてSpringIDEも出て欲しいな。


追記:
base-package属性はそこに書いたパッケージを含んだそれ以降の階層もちゃんとみてくれてるぽい。
DaoのサンプルをちょっといじってJdbcDaoSupportのサブクラスにしてテストしてみた。
この場合、

  @Autowired
  public void createTemplate(DataSource dataSource) {
    super.setDataSource(dataSource);
  }

こんな感じで親クラスのsetDataSourceを呼んでAutowiredでinjectionしなくちゃだめだった。
2.0の時は子クラスのproperty要素でDataSourceをinjectionできてただけに、ちょっと不便。
親クラスのためのinjecetionポイント作らなくちゃだめとは…。