0.ABOUT AOP
アスペクト指向プログラミング(AOP)は、ソフトウェア開発のホットトピックであり、Springフレームワークの重要な部分です。ビジネスロジックのさまざまな部分をAOPを使用して分離することができ、それにより、ビジネスロジックのさまざまな部分間の結合を減らし、プログラムの再利用性を改善し、開発の効率を改善することができます。
AOPはOOPの継続です。
主な機能は、ロギング、パフォーマンス統計、セキュリティ制御、トランザクション処理、例外処理などです。
主な意図は、ロギング、パフォーマンス統計、セキュリティ制御、トランザクション処理、例外処理などのコードをビジネスロジックコードから分割することです。これらの動作を分離することにより、それらを非誘導するビジネスロジックメソッドに分離し、ビジネスロジックコードに影響を与えることなくこれらの動作を変更したいと考えています。
ソースコードを変更せずにプログラムに機能を動的に追加するテクノロジーは、プリコンパイル方法とランタイム中の動的プロキシを通じて達成できます。 AOPは、実際にはGOF設計モデルの継続です。設計モデルは、発信者とCalleeの間の分離を追求し、コードの柔軟性とスケーラビリティを改善しています。 AOPは、この目標の実装であると言えます。
春にはアスペクト指向のプログラミングを豊富にサポートし、アプリケーションのビジネスロジックを監査やトランザクション管理などのシステムレベルサービスから分離することにより、まとまりのある開発を可能にします。アプリケーションオブジェクトは、自分がすべきことのみを実装します - 完全なビジネスロジック - それだけです。彼らは、ロギングやトランザクションサポートなど、他のシステムレベルの懸念を責任を負いません(または認識しています)。
1. Springでその他の外部構成ファイルまたはプロパティファイルをプロパティPlaceholderconfigurerをロードします。
多くのJavaeeプロジェクトでは、春の役割は非常に重要です。これは、他のモジュールやコンポーネントを管理する軽量コンテナです。 Springは、多くの場合、ストラット、Ibatis、Hibernateなどを管理する必要があります。これらのオープンソースフレームワークの構成ファイルは、SpringからSpringのプロパティプレイスホルディングコンピューターの管理のためにロードされます。さらに、データベース接続情報、JNDI接続情報プロパティファイルなどは、管理のためにPlactyPlaceHolderConfigurerを通じてSpringにロードすることもできます。使用法は次のとおりです。
(1)。 PropertyPlaceHolderConFigurerを介して他のファイルをSpringにロードします。
スプリング構成ファイルに次の構成を追加します。
<bean class = "org.springframework.beans.factory.config.propertyplaceholderconfigurer"> <プロパティ名= "locations"> <balue> classpath:load to Load </value>…</property> </bean> </bean>
(2)。 (1)の構成を介してロードされる構成または属性ファイルは、スプリングにロードされます。データベース接続情報やJNDI接続情報の使用など、実行時にロードされた構成またはデータファイルに関する情報を使用する必要がある場合は、型EL式の構文を参照して参照して使用できます。
<Bean Id =” DataSource” Destroy-Method =” Close” class =” org.apache.common.dbcp.basicdatasource”> <! - データベース接続情報が外部プロパティファイルに記述されていると仮定し、springによって読み込まれており、spring - > <プロパティ名=” driverclassname =” balue =” $ "url" <プロパティ名=” username” value =” $ {username}”/> <Property name =” Password” value =” $ {password}”/> </bean>
注:<Context:Property-PlaceHolderLocation = "classPath:file name to Load"/>を使用することもできます。
2。Javaの動的プロキシ:
Springの基礎となる実装原則は動的プロキシであるため、最初にアスペクト指向プログラミングを学ぶ前に動的プロキシを理解する必要があります。
動的プロキシはJavaで広く使用されており、動的プロキシは23の設計パターンで非常に一般的に使用される古典的なデザインパターンの1つです。動的プロキシの原理は、ターゲットオブジェクトまたはその方法を呼び出す場合、システムはターゲットオブジェクトを直接返すことではなく、プロキシオブジェクトを介してターゲットオブジェクトまたはメソッドにアクセスすることです。
動的プロキシの単純な原則は次のとおりです。
クライアント呼び出し元 - >プロキシオブジェクト - >ターゲットオブジェクトと呼ばれます。
クライアントがプロキシオブジェクトを呼び出すと、プロキシオブジェクトはターゲットオブジェクトを委任して、そのビジネスメソッドを呼び出します。
動的プロキシは、インターフェイスの動的プロキシと通常のクラスの動的プロキシの2つのタイプに分けられます。 Javaの動的プロキシは、実際のインターフェイスの動的プロキシです。 CGLIBは、通常のクラスの動的プロキシです。ターゲットJavaee依存関係パッケージとSpring Jarパッケージには、すでにCGLIB関連のJARパッケージが含まれているため、プロキシまたは通常のクラスを動的にプロキシできます。
(1).Javaのインターフェイスの動的プロキシ:
Javaの動的プロキシは、インターフェイスに対して動的にのみプロキシに導入できます。したがって、ターゲットオブジェクトはインターフェイスを実装する必要があり、プロキシオブジェクトはターゲットオブジェクトのすべてのインターフェイスを実装する必要があります。ワークフローは次のとおりです。
a。ダイナミックプロキシクラスライティング:
注:動的プロキシは、InvocationHandlerインターフェイスを実装し、次の方法を実装する必要があります。
コードコピーは次のとおりです。
Object Invoke(ObjectM Proxyインスタンス、メソッドプロキシインスタンス、オブジェクト[]プロキシインスタンスに渡されたパラメーター値のオブジェクト配列を呼び出すインターフェイスメソッドのメソッドインスタンス);
JDKをインストールするためのドキュメントについて説明します。このメソッドは、プロキシインスタンスを渡すために使用され、メソッドを呼び出すjava.lang.reft.methodオブジェクトと、パラメーターを含むオブジェクトタイプの配列を識別します。コールハンドラーは、適切な方法でエンコードされたメソッド呼び出しを処理し、返される結果は、プロキシインスタンスのメソッド呼び出しの結果として返されます。
b。プロキシオブジェクトを作成します。
proxy.newProxyInstance(クラスローダー、クラス<?> []インターフェイス配列、コールバックプロキシオブジェクト(通常はこれ))
ターゲットオブジェクトメソッドが呼び出されると、ターゲットオブジェクトのプロキシオブジェクトがメソッドを介して作成されます。プロキシオブジェクトは、ターゲットオブジェクトを呼び出して呼び出し結果を返すために、Invokeメソッドを自動的に呼び出します。
(2).cglibは、通常のJavaクラスの動的プロキシです。
CGLIBが動的プロキシを作成する場合、インターフェイスを実装するためにターゲットクラスが必要としません。そのワークフローは次のとおりです。
a。ダイナミックプロキシクラスライティング:
Enhancer Enhancer = new Enhancer(); //ターゲットクラスの親クラスを独自のEnhancer.setsuperclass(ターゲットクラスObject.getClass()に設定します。 //コールバックオブジェクトを動的プロキシオブジェクト自体に設定します。
b。 MethodEnterceptorインターフェイスを実装してください。
次の方法を実装してください。
Object Intercept(ObjectMプロキシインスタンス、メソッドプロキシインスタンス、オブジェクト[]オブジェクトのオブジェクトアレイは、プロキシインスタンスのメソッドコールに渡されたパラメーター値のオブジェクト配列、MethodProxyメソッドプロキシインスタンス);
注:CGLIBは、クラスの動的なプロキシだけでなく、メソッドの動的なプロキシもできます。
3。指向プログラミングの基本概念(AOP):
例として、通常のJavaメソッドを取ります
パブリックリターンタイプメソッド名(パラメーターリスト){ - >サラウンド通知メソッドプリプロシングコード - >プリノティフィケーショントライ{メソッド固有の実装(メソッドボディ)...メソッドポストプロセッシングコード - >ポストノーティフィケーション}キャッチ(例外処理... - >例外通知}最終{最終処理エージェント...
a。クロスカットの懸念:たとえば、上記の5つの通知の場所、Javaオブジェクトでは、許可確認、物の処理、ロギングなどの処理ロジックに追加できる同様の一般的な処理ロジックを持つこれらのオブジェクトは、相互カットの懸念と呼ばれます。オブジェクト指向プログラミング(OOP)の焦点は、現実の世界で垂直方向に抽象的なものをプログラミングオブジェクトモデルにすることです。アスペクト指向プログラミング(AOP)の焦点は水平であり、プログラミングオブジェクトモデルの処理ロジックと同様の場所を抽象化して接線を形成しますが、プログラミングオブジェクトの処理ロジックは水平な接線焦点です。
b。アスペクト:クロスカットの懸念を抽象化することは、クラスに似たセクションを形成することです。 2人は異なる懸念を持っています。クラスは物事の特性の抽象化であり、セクションは相互に訴える懸念の抽象化です。
c。 JoinPoint:傍受されるポイントは、春に言及されます。これは、Springはメソッドタイプの接続ポイント、つまり傍受された方法のみをサポートするためです。上記の例に示すように。
d。 PointCut:接続ポイントのインターセプトの定義(接続ポイントのコレクション)、つまり一連の傍受されたメソッドのコレクションを指します。
e。アドバイス:接続ポイントを傍受した後、つまり、傍受後の論理処理後に何をすべきかを指します。通常の許可確認、物の処理、ロギング、その他の操作は、通知で定義され、完了します。
f。ターゲット:プロキシのターゲットオブジェクト、つまりインターセプトされたオブジェクト。上記の例のように、メソッドが配置されているオブジェクト。
g。 Weave:ターゲットオブジェクトにセクションを適用し、プロキシオブジェクトの作成を引き起こすプロセスを指します。
h。はじめに:コードを変更せずに、はじめにはランタイム中にいくつかの方法とフィールドをクラスに動的に追加できます。
4。スプリングは、指向プログラミング(AOP)をサポートする依存関係をサポートしています。
春の後のディレクトリ内の次の3つのパッケージが減圧されます。
lib/asteyj/saspejweaver.jarlib/saspej/saspejrt.jarlib/cglib/cglib-nodep-2.1-3.jar
5.春にアスペクト指向プログラミング(AOP)を使用する場合、Spring構成ファイルにAOPネームスペースを導入する必要があります。つまり、次の構成を追加します。
xmlns:aop =” http://www.springframework.org/schema/aop”“ http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd」
注:スプリング2.5は、XML構成ファイルとJavaアノテーション方法に基づく2つのAOPメソッドを提供します。
注釈メソッドAOPを使用するには、Spring構成ファイルに次のオブジェクトアノテーションメソッドAOPサポートを追加する必要があります。
<aop:aspectj-autoproxy/>
6。JavabeanPackaging Class -BeanWrapper:
スプリングは、BeanWrapperクラスを介してJavabeanの動作をカプセル化し、次のような属性値を設定および取得できます。
beanwrapper wrapper class object = beanwrapperimpl(new wrapped class()); wrapper class object.setPropertyValue( "プロパティ名"、 "プロパティ値");
この方法を使用すると、プロパティをラップクラスに設定できます。
7。注釈に基づく指向指向プログラミング(AOP)開発:
(1)。 Spring構成ファイルに注釈方法のAOPサポートを追加します。
(2)。セクションを定義します。
通常のクラスの作成と同様に、クラスの前に「@Aspect」注釈を追加すると、クラスがセクションであることが示されます。
(3)。カット面にエントリポイントを追加します:
ポイントカットポイントは、インターセプトされたオブジェクトメソッドのコレクションです。通常、ポイントカットポイントは、セクションのポイントカットポイントを処理する方法で定義されます。 「@pointcut」アノテーションを使用すると、構文は次のとおりです。
@pointcut( "execution(*com.test.service ..*。*(..))")public void anymethod(){//メソッドは「ポイントカット」と「ポイントカット」処理と呼ばれます}
構文パラメーターの詳細な説明:
a。最初の「*」:傍受される方法が任意のリターンタイプであることを意味します。
b。 com.test.service:ここに簡単な例を示します。これは、傍受するパッケージの名前、つまり傍受するパケットを示しています。
c。インターセプトされたパケット名の後の2つの「..」は、インターセプトされたパケットの下のサブパケットも再帰的に傍受されることを意味します。つまり、インターセプトされたサブパケットです。
d。 "*" After "..":傍受されたパケットとそのサブパッケージ、つまり傍受されたクラスの下のすべてのクラスを表します。
e。最後の「*」:インターセプトされたクラスのすべてのメソッド、つまり傍受された方法を表します。
f。 「(..)」:傍受されたメソッドがパラメーター、つまり傍受されたパラメーターを受信することを意味します。
注:ポイントカット定義構文はワイルドカード文字をサポートできますが、構文ルールに厳密に従う必要があります。のように:
@pointcut( "execution(*com.test.service ..*。追加*(..))")
これは、com.test.serviceパッケージとそのサブパッケージの下のすべてのクラスの「追加」から始まるメソッドを傍受することを意味します。
(4)。セクションに通知を追加します。
春の通知の場所については、3の小さな例を参照してください。
「@before」アノテーション:事前に解釈を宣言します。
「@afterrutruning」注釈:notificationを宣言します。
「@after」注釈:最終通知を宣言します。
「@AfterThrowing」注釈:例外通知を宣言します。
「@Around」アノテーション:周囲の通知を宣言します。
通知を定義する例は次のとおりです。
@before( "anymethod()(スリット面で宣言されたエントリポイント名)")public void doaccesscheck(){...}
注:サラウンド通知は、他の4種類の通知とわずかに異なります。サラウンド通知は特別な方法で定義されています。サラウンド通知は、メソッドコールの前後に機能するため、接続ポイントオブジェクトを使用して、サラウンド通知処理後に論理処理を継続するために接続ポイントを指示する必要があります。その定義は次のとおりです。
@around(ポイント名に検索)パブリックオブジェクトdobasicprofiling(procedingjoinpoint pjp)スロー可能{... pjp.proceed(); //この文は、接続ポイントに他の操作を実行し続けるように指示します} 8。注釈に基づくアスペクト指向プログラミング(AOP)の開発のためのいくつかのヒント:
(1)。入力パラメーターを取得します:
のように:
@before( "ドット名&& args(入力パラメーター名)")public void dosomething(string inputパラメーター名){...}
(2)。返品結果を取得します:
のように:
@afterturning(pointcut =” sign in point name”、return =” return result name”)public void dosomething(string result name){…}
9。XMLに基づくセクション指向プログラミング(AOP)の開発:
(1)。ファセットクラスを定義し、ファセットクラスに通知を追加します。
(2)。通常のJavaクラスのように、Spring構成ファイルでファセットクラスを構成します。
(3)。次のように、Spring構成ファイルにAOP構成を追加します。
<aop:config> <! - 構成セクション - > <aop:aspect id = "section id" ref = "spring configuration file"> <! - configuration point-> <aop:aop: "section id" expression = "execution(*com.test.service ..*セクションクラスのメソッド "/> <aop:after…/>…</aop:aspect> </aop:config>
10。Springのトランザクション処理(Springの宣言的トランザクション処理):
簡単に言えば、トランザクションとは、データベースで最も基本的な操作の1つを指します。トランザクションの詳細な説明については、データベース関連の概要で詳しく説明します。 Springの指向プログラミング(AOP)の最も重要なアプリケーションの1つは、トランザクション管理です。 Spring 2.5以降のバージョンのトランザクション管理は、2種類の注釈ベースの方法とXMLファイルベースの方法をサポートしています。
(1)。注釈方法に基づくトランザクション管理:
a。次のように、スプリング構成ファイルにトランザクション管理名空間を追加します。
xmlns:ts = http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
b。次のように、Spring構成ファイルでトランザクションマネージャーを構成します。
<bean id =” txmanager” class =” org.springframework.jdbc.datasource.datasourcetransactionmanager”> <プロパティ名=” dataSource” ref =” springで構成されたデータソースBean”/>>
c。 Spring構成ファイルで注釈方法をサポートするトランザクション構成項目を追加します。
<TX:annotation-driventransaction-manager-tx:annotation-driventransaction-manager =” txmanager(springで構成されたトランザクションマネージャーBeanのID)”/>
d。注釈ベースのトランザクション管理を使用します。
春までに管理されたJavaeeプロジェクトでは、「@Transactional」アノテーションでトランザクションのビジネスロジックを追加する必要があります。
(2)。 XMLファイル方法に基づくトランザクション管理:
a。次のように、Spring構成ファイルでトランザクションマネージャーを構成します。
<bean id =” txmanager” class =” org.springframework.jdbc.datasource.datasourcetransactionmanager”> <プロパティ名=” dataSource” ref =” springで構成されたデータソースBean”/>>
b。 Spring構成ファイルにThing管理の次のセクションを追加します。
<aop:config> <! - トランザクションエントリポイント - > <aop:pointcut id =” transactionpointcut” expression =” execution(*com.test.service ..*。*(..)”/> <! - configure configure> <aop:advisor advice-ref =” txadvice” point-ref =” transactionpointpointcut "/> <c。 Spring構成ファイルにトランザクション通知に次の機能を追加します。
<TX:アドバイスID =” TXADVICE” TRUNACTIONMANAGER =” TXMANAGER”> <TX:属性> <! - 取得から始まるクエリメソッドを設定する例です。トランザクションをサポートしません - > <tx:メソッドname = "get*” read nownly =” true” propagation = <tx:method name =”*”/> </tx:属性> </tx:アドバイス>