導入
指向指向プログラミング(AOP)は、オブジェクト指向プログラミング(OOP)の欠点を補うプログラム構造について考えるための別の視点を提供します。クラスに加えて、AOPはファセットを提供します。複数のタイプとオブジェクトのクロスカットトランザクション管理など、フォーカスをモジュール化します。 (これらの懸念条件は、しばしば交差懸念と呼ばれます。)
Springの重要なコンポーネントは、AOPフレームワークです。それにもかかわらず、Spring IOCコンテナはAOPに依存していません。つまり、AOPを使用するかどうかを自由に選択できます。 AOPは強力なミドルウェアソリューションを提供し、Spring IOCコンテナをより完全にします。
春2.0 AOP:
Spring 2.0では、セクションをカスタマイズするためのよりシンプルで強力な方法を紹介します。ユーザーは、スキーマベースの方法を使用するか、@AspectJ Annotationsを使用することを選択できます。新しいアプリケーションの場合、ユーザーがJava 5で開発している場合は、ユーザーが@AspectJスタイルを使用することをお勧めします。そうしないと、パターンベースのスタイルを使用できます。どちらのスタイルも、AspectJのアドバイスタイプとポイントインカット言語を完全にサポートしていますが、Spring AOPを使用してまだ織り込まれています。
この章では、主にSpring 2.0のパターンベースと @saspjベースのAOPのサポートについて説明します。スプリング2.0は、スプリング1.2の後方互換性を完全に保持します。次の章では、Spring 1.2 APIが提供する基礎となるAOPサポートについて説明します。
春に使用されるAOP:
特にEJB宣言サービスの代わりに、宣言的なエンタープライズサービスが提供されます。最も重要なサービスは、Springの抽象的なトランザクション抽象化に基づいて構築されている宣言的なトランザクション管理です。
ユーザーはカスタムセクションを実装し、AOPを使用してOOPの使用を改善できます。
例
多くの場合、次のタイプを使用します
1。エージェントに基づくAOP
2。純粋でシンプルなJavaオブジェクトファセット
3。 @aspect annotationフォーム
4.注入フォームのASPCETセクションを1つずつ適用しましょう。
最初にいくつかの基本クラスを書きましょう。
インターフェイスクラス:
/ ***インターフェイスを定義します*/パブリックインターフェイスSleepable {/ *** Sleeping Method*/ void Sleep(); }実装クラス:
/ ***睡眠インターフェイスを実装*/パブリッククラスのChenllinaは、Sleapable {@Override public void Sleep(){// todo auto-enerated method stub.out.println( "良い、寝る時です!")); }}拡張クラス:
/ ***睡眠の強化を定義して、事前およびポストセットとポストセットとポストクラスの両方のスリープヘルパーを実現しました。 } @Override public void before(method method、object [] args、object target)throws throwable {system.out.println( "dream after Sleeping"); }}1。エージェントベースのAOP
<! - 強化されたアドバイスを作成します - > <bean id = "sleephelper"/> <bean id = "lina"/> <! - すべての睡眠方法を定義します - > <bean id = "sleeptointcut"> <プロパティ名= "パターン"値= "。 id = "Sleephelperadvisor"> <プロパティ名= "アドバイス" ref = "sleephelper"/> <プロパティ名= "pointcut" ref = "sleeoptointcut"/> </bean> <! - > <bean id = "linaproxy"> <propertial name = "regient" ref = "/> <proprity name" value = "sleephelperadvisor"/> <! - <プロパティ名= "proxyinterfaces" value = "com.tgb.springaop.service.sleepable"/> - > </bean>
構成ファイルのように:
パターン属性は、正規式を指定します。すべての睡眠方法に一致します。 org.springframework.aop.support.defaultpointcutadvisorを使用して、接線点と強化を組み合わせて完全な接線を形成します。最終的な構成が完了すると、org.springframework.aop.framework.proxyfactorybeanを介して最終的なプロキシオブジェクトが生成されます。
2。純粋でシンプルなJavaオブジェクトファセット
純粋にシンプルなJavaオブジェクトファセットを言う方法は?私の意見では、それはプロキシの使用を必要とせず、スプリングの内部メカニズムを自動的にスキャンする最初の構成に関連しています。この時点で、構成ファイルは次のように変更する必要があります。
<! - 強化されたアドバイスを作成します - > <bean id = "sleephelper"/> <! - ターゲットクラス - > <bean id = "lina"/> <! - configure point-cut and通知 - > <bean id = "sleepadvisor"> <プロパティ名= "アドバイス" ref = "sleephelper"> </propertiat name = "pertation =" "pertiat = <構成 - > <bean/>
最初のものよりもはるかに簡単ですか?もうプロキシを構成する必要はありませんか?
3。 @aspect annotationフォーム
私たちの経験に基づいて、注釈の形式は構成ファイルよりも単純であることも知っています。現時点では、既存の方法またはクラスについてコメントする必要があります。
/ ***Annotationを介して強化を追加*/ @Aspect @Component Public Class SleepHelper03 {/* @PointCut( "execution(*com.tgb.springaop.service.impl ..*(..)") void beforesleep(){system.out.println( "睡眠前にフェイシャルマスクを適用する"); } @afterturning( "sleeptoint()")public void aftersleep(){system.out.println( "Dream after Sleeping"); }
構成ファイルに書き込むだけです:
<! - スキャンパッケージ - > <コンテキスト:Component-scansベースパッケージ= "com.tgb" annotation-config = "true"/> <! - aspeatj annotation-> <aop:aspectj-autoproxy proxy-target-class = "true"/> <! - ターゲットクラス "/> <bean"/>>>>>
4.注入型のASPCETカットサーフェス
私は個人的に、これは最も単純で、最も一般的に使用され、最も柔軟であると感じています。構成ファイルは次のとおりです。
<! - ターゲットクラス - > <bean id = "lina"/> <bean id = "sleephelper"/> <aop:config> <aop:aspect ref = "sleephelper"> <aop:method = "beforesleed" pointcut = "execution( * * .sleep(..)"/>> <a aftele sleep = "" execution> </aop:aspect> </aop:config>
構成ファイルに記載されているsleephelper02クラスは次のとおりです。
/ ***アノテーションを介して強化を追加*/ public class sleephelper02 {public void beforesleep(){system.out.println( "睡眠前にフェイシャルマスクを適用する"); } public void aftersleep(){system.out.println( "睡眠後の夢"); }}
とてもシンプルに見えますか?あなたはすべてスプリングAOPを使用していますか? !
電話の方法については、ここにいくつかのテストクラスを書きました。あなたはそれを見ることができます。彼らは基本的に同じです:
/ ***構成ファイルspring_aop.xml proxyを介して*/ @test public void test(){applicationContext ct = new classpathxmlapplicationcontext( "spring_aop.xml");睡眠睡眠=(睡眠可能)ct.getbean( "linaproxy"); Sleeper.Sleep(); } / ***構成ファイルspring_aop_01.xml短い回答javaオブジェクト* / @test public void test01(){applicationContext ct = new classpathxmlapplicationcontext( "spring_aop_01.xml");睡眠睡眠=(睡眠剤)ct.getbean( "lina"); Sleeper.Sleep(); } / ***構成ファイルspring_aop_03.xml aspectによって発表されました睡眠睡眠=(睡眠剤)ct.getbean( "lina"); Sleeper.Sleep(); } / ***構成ファイルspring_aop_02.xml構成ファイルapsect* @author chen lina* @version 2015年5月31日10:09:37 am* / @test public void test02(){applicationcontext ct = new classpathxmlapplicationcontext(spring_02.xml ");睡眠睡眠=(睡眠剤)ct.getbean( "lina"); Sleeper.Sleep(); }
テストクラスから、AOPを実装する方法に関係なく、それらの使用も違いはありません。これらのテストクラスの結果は同じです。