Spring Framework勉強会の資料を公開しました
明日の資料です。
毒舌が少し入っていますが、年末なので許してください。
次のようなことを補足しました。
アプリケーションには、エンティティ的あるいはセッション的とでも呼ぶべきクラス群があると思います。実体(あるいは状態遷移)の表現を役割の主とするクラスです。このカテゴリを「エンティティ的」と呼びたいと思います。 一方、「エンティティ的」では無いクラスは、サービス提供を役割の主とすると考えます。一部は関数的かもしれません。多くは副作用(データベース更新など)を目的とするので、こちらのカテゴリを「サービス的」と呼びたいと思います。 インターフェースに対してプログラミングをして、具象クラスの実装から疎結合にすべきなのは「サービス的」なクラスの方です。つまり、DIで注入するのは、「サービス的」な具象クラスへの依存です。
「エンティティ的」なオブジェクトにも、DIとは別の視点で、インスタンス化の(一種の)分離があります。エンティティ的オブジェクトは、実行時のライフタイムの管理に複雑さが入り込みがちです(*)。このため、ライフタイム管理を、ある層に押しつけることは良くあります。上位層から見ると、ライフタイム管理を押しつけた層にインスタンス化の役割を分離、コード的に言うと隠蔽をすることになります。
これら2つは、インスタンス化の工程の分離という観点では似ていますが、基本的には違うものだと思います。
サービス的とエンティティ的が排他的だという主張ではありません。また、後者の用途にSpringのBean Factoryを使うことはできます。
(*)GCがあるとメモリ管理の複雑さからは解放されますが、性能問題などの複雑さは残りつづけます。
説明に対する補足です。
ApplicationContext ac = new FileSystemXmlApplicationContext("di3.xml"); DiTest3 di3 = (DiTest3)ac.getBean("di3");
2行目の部分の裏にnew DiTest3()のような処理があると思ってください、と言いましたが、かなり誤解を招く説明なので訂正します。 より現実の動作に近い説明をすると、次のようになります。
ApplicationContext ac = new FileSystemXmlApplicationContext("di3.xml"); // => global_map.put("di3", new DiTest3()); DiTest3 di3 = (DiTest3)ac.getBean("di3"); // => (DiTest3)global_map.get("di3");
global_mapの型はMap<String,Object>だと見なしてください。
スコープに応じて、global_mapの部分が、HttpSessionだったり、HttpRequestだったりします("di3"がattribute名に相当します)。
- Category(s)
- カテゴリなし
- The URL to Trackback this entry is:
- http://dev.ariel-networks.com/Members/inoue/spring-workshop/tbping
Re:Spring Framework勉強会の資料を公開しました
つまり、privateな属性にannotationを記述して、コンパイル時にgetter/setterを自動生成せよと。
…C#の属性そのまんまじゃん。