【設計モード】Springで使用する設計モード
12680 ワード
一、導入
Springは業界の古典的なフレームワークとして、アーキテクチャ設計においても、コード作成においても、行内典範と言える.Springフレームワークでは多くのデザインパターンが使われていますが、代表的なものをいくつかご紹介します.
二、Springでよく使われる8種類の設計モード
2.1工場モデルファクトリモードは、通常、アプリケーションがnewを直接使用して新しいオブジェクトを作成し、オブジェクトの作成と使用を分離するために、ファクトリモードを採用します.すなわち、アプリケーションはオブジェクトの作成および初期化の職責をファクトリオブジェクトに渡します. Spring工場モードを使用すると、BeanFactory(遅延注入)またはApplicationContext(コンテナ起動時にすべてのbeanを作成し、BeanFactoryの拡張)を使用してbeanオブジェクトを作成できます.例: アプリケーションcontext.xmlプロファイル 試験類 2.2単例モード Springにおけるbeanのデフォルトの役割ドメインはsingleton(単例)であり、prototype、request、session、global-sessionといういくつかの役割ドメインもある. Springが一例を実現する方法: XML 注記 Springは、ConcurrentHashMapによって単一レジストリを実現する特殊な方法で単一モードを実現する.Spring実装の一例のコアコードは以下の通りである:
2.3アダプタモード Spring AOPの実装はエージェントモードに基づいているが、Spring AOPの拡張または通知(Advice)はアダプタモードに使用され、それに関連するインタフェースはAdvisorAdapterである. Adviceでよく使われるタイプは、BeforeAdvice、AfterAdvice、AfterReturningAdviceなどです.各タイプのAdvice(通知)には、M e t h o d BeforeAdviceInterceptor、AfterReturningAdviceAdapter、AfterReturningAdviceInterceptorという対応するブロッカーがあります.Springの事前定義された通知は、対応するアダプタを介して、MethodInterceptorインタフェース(メソッドブロッカー)タイプのオブジェクトに適しています. Spring MVCでは、DispatcherServiceletが要求情報に基づいてHandlerMappingを呼び出し、要求に対応するHandlerを解析する.対応するHandler(いわゆるControllerコントローラ)を解析した後、HandlerAdapterアダプタで処理を開始します.HandlerAdapterは所望のインタフェースとして,具体的なアダプタ実装クラスはターゲットクラスを適合させるために用いられ,Controllerは適合が必要なクラスとして用いられる.
2.4装飾モード SpringのアプリケーションContextで構成されているdataSourceは、異なるタイプのデータベースであるか、異なるデータソースである可能性があります.sessionFactoryは、お客様の要求に応じてdataSourceプロパティを異なるデータソースに設定し、データソースを切り替える目的を達成します. Springで使用されるパッケージングモードは、クラス名にWrapperが含まれているものと、クラス名にDecoratorが含まれているものの2つの表現があります.基本的には、オブジェクトに追加のロールを動的に追加します.
2.5エージェント・モード SpringのProxyモードは、JdkDynamicAopProxyやCglib 2 AopProxyのようなaopに現れる. Spring AOPは動的エージェントに基づいており、エージェントするオブジェクトがインタフェースを実装する場合、Spring AOPはJDK Proxyを使用してエージェントオブジェクトを作成し、インタフェースを実装していないオブジェクトに対してはCglibを使用し、エージェントとして被エージェントオブジェクトのサブクラスを生成します. AOPはAspectJを使用して実装することもでき、Spring AOPはランタイムエンハンスメントに属し、AspectJはコンパイル時エンハンスメントである.Spring AOPはプロキシベースであり、AspectJはバイトコード操作ベースである.
2.6観察者モード SpringでObserverモードがよく使われるところはlistenerの実装です.ApplicationListenerなどです. Springイベント駆動モデルは、多くのシーンでコードをデカップリングできる観察者モードの古典的な応用である.
2.7ポリシー・モード Springでは、オブジェクトをインスタンス化するときにStrategyモードを使用したり、リソースファイルをロードする方法を使用したりして、ClassPathResourcee、FileSystemResource、Service ContextResource、UrlResourceなど、さまざまな方法を使用しています. Aopの実装では、JDKダイナミックエージェントとCGLIBエージェントの2つの異なる方法が採用されている. Springのトランザクション管理、PlatformTransactionManagerはトランザクション管理インタフェースを表しますが、下位レベルでトランザクションをどのように管理するかはわかりません.トランザクション管理に開始トランザクション(getTransaction()、commit()、rollback()の3つのメソッドを提供する必要がありますが、どのように実装するかは、特定の実装クラスに任せて完了します.異なる実装クラスは、異なるトランザクション管理ポリシーを表します. 2.8テンプレートメソッドモードテンプレートメソッドモードは、動作中のアルゴリズムのスケルトンを定義し、いくつかのステップをサブクラスに遅延させる動作設計モードである.テンプレートメソッドにより、サブクラスは、アルゴリズムの構造を変更することなく、アルゴリズムの特定のステップの実装方法を再定義することができる. SpringでjdbcTemplate、hibernateTemplateなどTemplateで終わるデータベース操作のクラスは、テンプレートモードに使用されます.一般的には継承方式を用いてテンプレートモードを実現していますが、Springではこの方式は使用されず、Callbackモードを用いてテンプレート方法モードと連携し、コード多重化の効果を達成しています柔軟性の向上を実現しました.
三、まとめ ファクトリモード:Springファクトリモードを使用してBeanFactory、ApplicationContextからbeanオブジェクトを作成します. 単例モード:SpringのBeanのデフォルトは単例です. アダプタモード:Spring AOPの拡張または通知(Advice)がアダプタモードに使用されています. デザイナモード:異なるデータベース、異なるデータソースに接続する必要があります. エージェントモード:Spring AOP機能の実現. オブザーバモード:Springイベント駆動モデルはオブザーバモードの古典的な応用である. ポリシー・モード:Springがリソースをロードする方法. テンプレートメソッドモード:SpringでjdbcTemplate、hibernateTemplateなどのTemplateで終わるデータベース操作のクラス. 私はやっと浅くて、もし间违いがあれば、指摘してください、ありがとうございます!もしあなたがもっと良い提案があれば、伝言を残して私达と一绪に讨论することができて、共に进歩します!心からあなたが辛抱強くこの博文を読むことができることに感谢します!
Springは業界の古典的なフレームワークとして、アーキテクチャ設計においても、コード作成においても、行内典範と言える.Springフレームワークでは多くのデザインパターンが使われていますが、代表的なものをいくつかご紹介します.
二、Springでよく使われる8種類の設計モード
2.1工場モデル
<bean id="student" class="com.happy.MyStudent">
<property name="age" value="18"/>
</bean>
public class SpringDesignModeDemo {
public static void main(String[] args) {
ApplicationContext context = new FileSystemXmlApplicationContext("../applicationcontext.xml");
MyStudent myStudent = (MyStudent) context.getBean("student");
myStudent.getAge();
}
<bean id="student" class="com.happy.MyStudent" scope="singleton"/>
@Scope(value = "singleton")
// ConcurrentHashMap( )
private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);
public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
Assert.notNull(beanName, "'beanName' must not be null");
synchronized (this.singletonObjects) {
//
Object singletonObject = this.singletonObjects.get(beanName);
if (singletonObject == null) {
//...
try {
singletonObject = singletonFactory.getObject();
}
//...
// , 。
addSingleton(beanName, singletonObject);
}
return (singletonObject != NULL_OBJECT ? singletonObject : null);
}
}
//
protected void addSingleton(String beanName, Object singletonObject) {
synchronized (this.singletonObjects) {
this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
}
}
}
2.3アダプタモード
2.4装飾モード
2.5エージェント・モード
2.6観察者モード
2.7ポリシー・モード
三、まとめ