『Spring実戦』第1章読書ノート


最近の開発では、スプリングフレームワークの習得が未熟な感じがして、『スプリング実戦』という本を改めてめくって、もう一度勉強して、それを記録しました.
1.1.2依存注入
いずれの実用的なアプリケーションも、特定のビジネスロジックを完了するために互いに協力する2つ以上のクラスから構成されています.通常、各オブジェクトは、互いに協力するオブジェクト(すなわち、依存するオブジェクト)の参照を管理します.これにより、高度に結合され、テストが困難なコードになります.
高度な結合によって特定のタスクを実行するknightクラス:
package com.springinaction.knights;
public class DamselrescuingKnight implements Knight{
private RescueDamselQuest quest;

public DamselRescuingKnight(){
    quest = new RescueDamselQuest();
}

public void embarkOnQuest() throws QuestException{
    quest.embark();
}
}

DamselrescuingKnightクラスは、そのコンストラクタでRescueDamselQuestを独自に作成します.これにより、DamselrescuingKnightはRescueDamselQuestと緊密に結合されているため、このクラスの能力が極めて制限され、対応するレスキュー(RescueDamselQuest)タスクしか実行できず、他のタスクは実行できない.
最適化後、十分に柔軟で強力なBraveKnightクラス:
package com.springinaction.knights;
public class braveKnight implements Knight{
	private Quest quest;

	public BraveKnight(Quest quest){
		this.quest = quest;       //

ご覧のように、以前のDamselrescuingKnightとは異なり、BraveKnightは自分でタスクを作成していない(すなわち、コンストラクタでnewの新しい特定のオブジェクトがない)のではなく、コンストラクタパラメータとしてコンストラクタにタスク(Quest)を入力します.これは注入に依存する方式の一つであり,すなわち構造器注入である.
さらに重要なのは,それが伝達される探検タイプはQuest,すなわちすべてのタスクが実現しなければならないインタフェースである.したがって、BraveKnightは、RescueDamselQuest、SlayDragon-Quest、MakeRoundTable RoundQuestなどのいずれかのQuestインタフェースの具体的な実装に応答することができ、BraveKnightは特定のQuest実装と結合していない.
アプリケーションコンポーネント間のコラボレーションを作成する動作は、通常、アセンブリと呼ばれます.Springはbeanを装備する方法が多く、XML構成を採用するのは通常最も一般的な組立方法である.
Springプロファイルを使用してSlayDragonQuestをBraveKnightに注入します.



	
		   // BraveQuest      quest bean
		
	

	   //  SlayDragonQuest bean



どのように動作するかを確認します.
Springは、コンテキスト(Application Context)を適用してBeanの定義をロードし、それらを組み立てる.Springアプリケーションコンテキストは、オブジェクトの作成と組み立てを担当します.Springは、構成をどのようにロードするかという主な違いを持ついくつかのアプリケーションコンテキストの実装を備えています.
Knightを含むSpringコンテキストをロードします.
package com.springinaction.knights;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class KnightMain{
	public static void main(String[] args){
		ApplicationContext context = new ClassPathXmlApplicationContext("knights.xml"); //  Spring   
		
		Knight knight = (Knight) context.getBean("knight");  //  knight Bean
		
		knight.embarkOnQuest();   //  knight
	}
}

このクラスはknightがどのタスクを受け入れているのか全く分からないし、BraveKnightが実行していることも現れていない.
1.1.3切断面の適用
注入に依存して相互に協力するソフトウェアコンポーネントは緩やかな結合を維持し,AOPプログラミングはアプリケーションのあちこちに広がる機能を分離して再利用可能なコンポーネントを形成することを可能にする.
AOPを利用すると,様々な機能層を用いてコアビジネス層を包むことができる.これらのレイヤは、システムに宣言的に柔軟に適用され、コアアプリケーションの存在さえ知らない.これは、セキュリティ、トランザクション、ログの注目点をコアビジネスロジックから分離する強力なコンセプトです.
AOPアプリケーション:
一人一人が騎士のことをよく知っているのは、吟遊詩人が騎士の事績を詩で記し、それを称賛したからだ.Minstrel(吟遊詩人)類は騎士のすべての事績を記載している.
package com.springinaction.knights;

public class Minstrel{
	public void springBeforeQuest{
		//          
		System.out.println("Fa la la;The knight is so brave!");
	}
	
	public void singAfterQuest(){
		//         
		System.out.println("Tee hee he;The brave knight did embark on a quest!");
	}

}

適切にBraveKnightを調整するにはMinstrelを使用します.BraveKnightはMinstrelメソッドを呼び出す必要があります.
package com.springinaction.knights;

public class BraveKnight implements Knight{
	private Quest quest;
	private Minstrel minstrel;

	public BraveKnight(Quest quest,Minstrel minstrel){
		this.quest = quest;
		this.minstrel = minstrel;
	}

	public void embarkOnQuest() throws QuestException{
		minstrel.singBeforeQuest();
		quest.embark();
		minstrel.singAfterQuest();
	}
}

これにより、予想される効果を達成することができるが、吟遊詩人を管理することは騎士の職責ではなく、騎士は任務を遂行するだけで、吟遊詩人は自主的に賛美を記録する必要がある.
AOPを利用して、吟遊詩人は騎士の事績を讃えなければならないと宣言することができ、騎士は吟遊詩人の方法を直接訪問しなくなった.Minstrelを断面として抽象化し、Springプロファイルで宣言すればよい.
Minstrelは断面として宣言されました.


		
	
	
	//  minstrel Bean
	
	
	
		
			//    
			
			
			//      
			

			//      
			
		
	

前置通知,後置通知の両方にembankという切り込み点が参照される.この切り込みポイントは、前の要素で定義され、適用される通知を選択するためにexpressionプロパティを構成します.
Springの2つの異なるタイプのコンテナ実装:
Beanファクトリ(bean factories、org.springframework.beans.factory.BeanFactoryインタフェースによって定義される)は最も簡単なコンテナであり、基本的なDIサポートを提供する.
アプリケーションコンテキスト(アプリケーション)はorg.springframework.context.ApplicationContextインタフェース定義)は、BeanFactoryに基づいて構築され、アプリケーション向けのサービスを提供します.
Springが持つ3つの最も遭遇する可能性のあるアプリケーションコンテキスト:
ClassPathXmlApplicationContext:クラスパスの下にあるXMLプロファイルからコンテキスト定義をロードし、アプリケーションコンテキスト定義ファイルをクラスリソースとして使用します.
FileSystemXmlapplicationcontext:ファイルシステムのXMLプロファイルを読み込み、コンテキスト定義をロードします.
XmlWebApplicationContext:WebアプリケーションのXMLプロファイルを読み込み、コンテキスト定義をロードします.
FileSystemXmlapplicationcontextをロードします.
ApplicationContext context = new FileSystemXmlApplictionContext("c:/foo.xml");

同様に、ClassPathXmlApplicationContextをロードします.
ApplicationContext context = new ClassPathXmlApplicationContext("foo.xml");

両者の違いは、FileSystemXmlApplicationContextが指定するファイルシステムパスの下でfooを検索することである.xmlファイル.
一方、ClassPathXmlApplicationContextは、jarファイルを含むすべてのクラスパスでfooを検索する.xmlファイル.
SpringのBeanのライフサイクル:
1、SpringはBeanをインスタンス化する.
2、Springは値とBeanの参照をBeanの対応する属性に注入する.
3.BeanがBeanName Awareインタフェースを実現した場合、SpringはBeanのIDをsetBeanName()インタフェースメソッドに渡す.
4.BeanがBeanFactoryAwareインタフェースを実装した場合、SpringはsetBeanFactory()インタフェースメソッドを呼び出し、BeanFactoryコンテナインスタンスを転送する.
5.BeanがApplicationContextAwareインタフェースを実装した場合、SpringはsetApplicationContext()インタフェースメソッドを呼び出し、アプリケーションコンテキストの参照を入力します.
6.BeanがBeanPostProcessorインタフェースを実装した場合、SpringはそれらのpostProcessBeforeInitialization()インタフェースメソッドを呼び出す.
7.BeanがInitializationインタフェースを実装した場合、SpringはそれらのafterPropertiesSet()インタフェースメソッドを呼び出す.同様に、Beanがinit-methodを使用して初期化メソッドを宣言した場合、このメソッドも呼び出されます.
8.BeanがBeanPostProcessorインタフェースを実装した場合、SpringはそれらのpostPoressAfterInitialization()メソッドを呼び出す.
9、この時点で、Beanはすでに準備ができていて、使用することができて、それらはずっとアプリケーションコンテキストの中に存在して、そのアプリケーションコンテキストが破棄されたことを知っています.
10.BeanがDisposableBeanインタフェースを実装した場合、Springはそのdestroy()インタフェースメソッドを呼び出す.同様に、beanがdestroy-methodを使用して破棄メソッドを宣言した場合、このメソッドも呼び出されます.
Springモジュール:
1、コアスプリング容器(Core Spring container)
2、SpringのAOPモジュール
3、データアクセスと集積
4、Webとリモートコール
5、テスト