・まーちんふらいあー(M. Fowler)が、IoC(Inversion of Control:制御の反転)を整理したところからはじまり
・オブジェクトの依存性をあとから注入する
→アスペクト指向のAroundでも実現できる
・実現方法:DIコンテナ
■DIとは?
AがB(抽象クラス)を使っていて、Bのインスタンスは、B1,B2であるというとき
Aがインスタンスかされるには、B1,B2のインスタンスを実装しないといけない
→AがB1,B2を知っている(依存性がある)
これでは、AとB1、B2の依存性が高くなる
そこで、
Aは、Bを使う
Aは、DIコンテナさんに、インスタンス化頼む
DIが、B1か、B2かを決めて、インスタンス→設定ファイルに書いてある:局所化した
とする、これがDI
こうすると、アプリケーション立ち上げ時に、何を使うか決定できる。
DIコンテナの上にPOJOを置いておく
■DIの種類:なにをインジェクションするの
・インター・フェースインジェクション
・セッター・インジェクション
・コンストラクタ・インジェクション
■DIとAOP
AOPのほうが、実現できることが広い
AOPのポイントカットに特化したといえる。
DIはインスタンス生成に特化=目的にあっていれば使いやすい
■Springフレームワーク
・DIコンテナ
・MVCフレームワーク
・JDBC抽象化フレームワーク
・AOPフレームワーク
・Webインテグレーション
・ORMインテグレーション
以下の話は、Tomcat+Springをやる
(ロギングは、/WEB-INFにlog4j.xmlを置く事で可能)
Springは、プレゼンテーション層 ,ビジネス、データアクセスすべて対応してる。
→もちろん、プレゼン層にStruts、データアクセスにHibernateを入れてもOK
■Spring DIコンテナ
・Bean定義ファイル(デフォルトapplicationContext.xml)に、JavaBeansの構成
→beans
bean id=オブジェクト名 class=パッケージ.クラス
property name=変数名
value 値
→setter,getterがある→プロパティがある
→propertyのref beanで、オブジェクトをプロパティに代入可能
・DIコンテナ
Beanファクトリ
(Applicationコンテキスト:Beanファクトリの上位)
■Eclipseで・・・
・プロジェクトを作成する
・Sample.javaっていうかたちで、メインのクラスをつくったとする。
・そこに、こんなかんじで、サンプルをつくるお(sampleパッケージにあるとする)。
package sample; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.xml.XmlBeanFactory; import org.springframework.core.io.ClassPathResource; import org.springframework.core.io.Resource; public class Sample { public static void main(String[] args) { Resource resource = new ClassPathResource("/sample/sample.xml"); BeanFactory beanFactory = new XmlBeanFactory(resource); MyClass taro = (MyClass) beanFactory.getBean("obj1"); } }
・MyClassクラスをつくるお
→getter,setterがあればいい
・Bean定義ファイル(ここでは/sample/sample.xml)をつくるお
その中には、beanでid=obj1,classにMyClassが定義されているはずお
・プロパティを開いて、Spring→BeansSupportで、Bean定義ファイル(xml)を指定してから
・Javaアプリケーションとして実行する
■こうすると・・・
Bean定義ファイル(xml)をかえるだけで、
→プロパティを開いて、Spring→BeansSupportで、Bean定義ファイル(xml)を指定をかえるだけで、
実行するものが変えられる。
■EclipseのTomくんにかんして
・ウィンドウの設定、Tomくんのバージョンとか、ホームを設定すること。
・あと、Tomcatで、対象プロジェクトを右ボタンクリックしたあとで、これやってね
■AOPに比べた欠点
同じ値を返す、複数のクラスとか(モックでNullを返すとき)を作る場合、
DIだと、みんな作んないといけない
(アスペクトなら、クラス名、メソッド名に*を使って、いっぱつでいける)
こんかいつかった、すぷりんぐ