#Spring で使用されるデザイン パターンとは何ですか
1. シンプルなファクトリ パターン
は、Static Factory Method (StaticFactory Method) パターンとも呼ばれますが、23 の GOF デザイン パターンの 1 つではありません。
単純なファクトリ パターンの本質は、ファクトリ クラスが、受信パラメータに基づいてどの製品クラスを作成するかを動的に決定することです。
Spring の BeanFactory は、単純なファクトリ パターンの具体化です。Bean オブジェクトは一意の識別子に従って取得されますが、パラメータが渡された後に作成されるか、パラメータが渡される前に作成されるかは、具体的な状況、確かに。次の構成では、HelloItxxxz クラスに itxxxzBean を作成します。
<beans> <bean id="singletonBean" class="com.itxxz.HelloItxxz"> <constructor-arg> <value>Hello! 这是singletonBean</value> </constructor-arg> </ bean> <bean id="itxxzBean" class="com.itxxz.HelloItxxz" singleton="false"> <constructor-arg> <value>Hello! 这是itxxzBean! </value> </constructor-arg> </bean> </beans>
推奨される学習: 春とは何ですか?
2. ファクトリ メソッド パターン
通常、アプリケーションは new を直接使用して新しいオブジェクトを作成しますが、オブジェクトの作成と使用を分離するために、パターン、つまりアプリケーションはオブジェクトの作成と初期化の責任をファクトリ オブジェクトに渡します。
一般に、アプリケーションには Bean を作成するための独自のファクトリ オブジェクトがあり、そのアプリケーション独自のファクトリ オブジェクトが管理のために Spring に渡されると、Spring は通常の Bean ではなく、ファクトリ Bean を管理します。
ファクトリ メソッドの静的メソッドを例として説明します:
import java.util.Random; public class StaticFactoryBean { public static Integer createRandom() { return new Integer(new Random().nextInt()); } }
config.xm 構成ファイルを作成し、管理用に Spring コンテナに組み込みます。ファクトリ メソッドによる静的メソッド。名前:
<bean id="random"class="example.chapter3.StaticFactoryBean" factory-method="createRandom" scope="prototype"/>
テスト:
public static void main(String[] args) { //调用getBean()时,返回随机数.如果没有指定factory-method,会返回StaticFactoryBean的实例,即返回工厂Bean的实例 XmlBeanFactory factory = new XmlBeanFactory(new ClassPathResource("config.xml")); System.out.println("我是IT学习者创建的实例:"+factory.getBean("random").toString()); }
3。シングルトン モード
は、クラスのインスタンスが 1 つだけであることを保証し、アクセス ポイントへのグローバル アクセスを提供します。 Spring のシングルトン モードは文の後半を完成させます。つまり、グローバル アクセス ポイント BeanFactory を提供します。ただし、Spring は任意の Java オブジェクトを管理するため、コンストラクター レベルからのシングルトン制御はありません。
重要なヒント: Spring のデフォルト Bean はすべてシングルトンであり、singleton="true|false" またはscope="?" で指定できます。
4. アダプター パターン
Spring の Aop では、プロキシ クラスの機能を強化するためにアドバイス (通知) が使用されます。 Spring によるこの AOP 関数の実装の原理は、プロキシ モード (1. JDK 動的プロキシ。2. CGLib バイトコード生成テクノロジ プロキシ) を使用して、クラスのメソッド レベルの側面を強化することです。つまり、次のプロキシ クラスを生成します。プロキシクラスにインターセプタを設定し、プロキシクラスのメソッドの前にインターセプタを設定し、インターセプタの重要な内容を実行することでプロキシメソッドの機能を強化し、アスペクト指向プログラミングを実現します。
Adapter クラス インターフェイス: Target
public interface AdvisorAdapter { boolean supportsAdvice(Advice advice); MethodInterceptor getInterceptor(Advisor advisor); }
MethodBeforeAdviceAdapter クラス、
Adapterclass MethodBeforeAdviceAdapter implements AdvisorAdapter, Serializable { public boolean supportsAdvice(Advice advice) { return (advice instanceof MethodBeforeAdvice); } public MethodInterceptor getInterceptor(Advisor advisor) { MethodBeforeAdvice advice = (MethodBeforeAdvice) advisor.getAdvice(); return new MethodBeforeAdviceInterceptor(advice); } }
5、ラッパー モード
推奨事項: spring Chinese Manual
私たちのプロジェクトではこのような問題が発生しました: 私たちのプロジェクトは複数のデータベースに接続する必要があり、さまざまな顧客が訪問するたびにニーズに応じてさまざまなデータベースにアクセスします。以前は、Spring および Hibernate フレームワークでデータ ソースを常に構成していたため、sessionFactory の dataSource 属性は常にこのデータ ソースを指し、変更されませんでした。sessionFactory を使用する場合、すべての DAO はこのデータ ソースを通じてデータベースにアクセスします。
しかし、現在、プロジェクトのニーズにより、DAO は sessionFactory にアクセスするときに複数のデータ ソース間で常に切り替える必要があります。疑問が生じます: sessionFactory にデータの永続性を実行させる方法は、顧客が動的に切り替えることができるかということです。ニーズに応じてさまざまなデータソースを使用できるでしょうか? Spring フレームワークでいくつかの変更を加えれば解決できるでしょうか?活用できるデザインパターンはありますか?
まず、Spring の applicationContext ですべての dataSource を構成することを考えてください。これらの dataSource は、Oracle、SQL Server、MySQL などのさまざまなデータベースなど、さまざまなタイプの場合があります。また、Apache によって提供される org.apache.commons.dbcp.BasicDataSource や、Apache によって提供される org などの異なるデータ ソースである場合もあります。 spring.springframework.jndi.JndiObjectFactoryBean など次に、sessionFactory は、データ ソースを切り替える目的を達成するために、各顧客の要求に従って dataSource 属性を異なるデータ ソースに設定します。
Spring で使用されるラッパー パターンには、クラス名に 2 つの表現があります。1 つはクラス名に Wrapper が含まれること、もう 1 つはクラス名に Decorator が含まれることです。基本的に、これらはオブジェクトに追加の責任を動的に追加します。
6. プロキシ モード
このオブジェクトへのアクセスを制御するために、他のオブジェクトにプロキシを提供します。構造的には Decorator パターンに似ていますが、Proxy は制御であり、機能の制限に近いのに対し、Decorator は責任を増やすことを目的としています。 Spring のプロキシ モードは、JdkDynamicAopProxy や Cglib2AopProxy などの AOP に反映されます。
7. オブザーバー パターン
オブジェクト間の 1 対多の依存関係を定義します。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトがオブジェクトになります。自動的に通知され、更新されます。 Spring で Observer パターンが最も一般的に使用される場所は、listener の実装です。 ApplicationListener など。
8. 戦略モード
一連のアルゴリズムを定義し、それらを 1 つずつカプセル化し、交換可能にします。このパターンでは、アルゴリズムを使用するクライアントとは独立してアルゴリズムを変更できます。ストラテジ モードは、オブジェクトをインスタンス化するときに Spring で使用されます。SimpleInstantiationStrategy の次のコードは、ストラテジ モードの使用を示しています:
9. テンプレート メソッド モード
一部のステップをサブクラスに延期しながら、アルゴリズムのスケルトンを 1 回の操作で定義します。テンプレート メソッドを使用すると、アルゴリズムの構造を変更せずに、サブクラスがアルゴリズムの特定のステップを再定義できます。
テンプレート メソッド パターンは通常、継承する必要があります。ここでは、テンプレート メソッドについての別の理解を探ってみたいと思います。 Spring で JdbcTemplate を使用する場合、このクラスにはメソッドが多すぎるため、このクラスを継承したくありませんが、それでも JdbcTemplate が持つ安定したパブリック データベース接続を使用したいと考えています。変更を抽出し、パラメータとして JdbcTemplate メソッドに渡すことができます。ただし、変更されるのはコードの一部であり、このコードは JdbcTemplate の変数を使用します。何をするか?次に、コールバック オブジェクトを使用してみましょう。
(関連ビデオ チュートリアルの共有: java ビデオ チュートリアル)
このコールバック オブジェクトの JdbcTemplate で変数を操作するためのメソッドを定義します。このメソッドを実装するには、変更点は次のとおりです。ここに集中しています。次に、このコールバック オブジェクトを JdbcTemplate に渡して呼び出しを完了します。これは、継承を行わずにテンプレート メソッドを実装する別の方法である可能性があります。
以下は具体的な例です: JdbcTemplate のメソッドの実行
JdbcTemplate はメソッドの実行を実行します
以上がSpring で使用されるデザイン パターンは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。