makotan _at_ gmail dot com

Spring3とCDIの比較

あくまで2012年の第四半期頃に触ったCDIとの比較なので、今の最新版はいろんなものが解消されてる・・・といいな〜

DIとしての機能

CDIはclassのスキャンを基本にしてアノテーションだけで済まそうとしてる
ただし、空っぽのxmlファイルは一つ絶対に必要
SpringはXMLでの定義が基本

Scopeの違い

CDISeamから継承してるスコープがある(conversation scope)
Springは昔から変わってない
両方とも独自スコープを追加できるのであんまり絶対的な比較にならない気がする(Seasarは出来ないんだよなぁ〜)

AOPの違い

CDIアノテーションAOPを使う事を宣言して実際に適用するものはbean.xmlに書く
SpringはXMLに書く必要がある。困ったことにいろんな書き方、種類があるので迷う。
ぶっちゃけSpringって駄目じゃんって思うのはいつもここw

環境依存の違い

CDIはプロダクト毎にこれのこのバージョンは動く・動かないが色々ある
Springはメジャーな環境ならほぼ対応してる

テスト記述の違い

CDIにはテストの方法の標準は無いのでプロダクト独自規格
Springはスタンダードがある(とはいえSpring独自規格って意味では同じ)

DBアクセス系の違い

CDIが前提としてるのはJavaEEのプロダクト
Springは非JavaEEも対応

Webフレームワーク関係の違い

CDIが前提としているのはJavaEEのプロダクト
Springは非JavaEEも対応

周辺ライブラリの量の違い

CDIはちょっと増えてきてはいるけど、まだ少ない
Springは圧倒的に多い。全く関係ないものが独自対応するくらいに多い

CDIにあってSpringに無い機能もある

普通のメソッドの戻りをComponentとして扱ったり(datasourceとかね)
後発なだけに色々工夫してるなぁ〜って気がする


で、どっちが良い?

かな〜〜り長期的に見ると、SpringがCDI対応すると思うのでどっちでもw
現時点で言うと・・・

  • 記述のしやすさ設定の容易さはCDIが圧勝
  • 周辺プロダクトの多さだとSpringが圧勝
  • 情報量でもSpringが圧勝(ほとんどが英語)

なので、使いたいWebフレームワークだったりDBアクセスプロダクトがある方を選ぶが今の時点だと正解だと思う
という意味でまだSpring。