この記事を読む前に、 「 SpringのIOCとAOPおよびコードの例の簡単な理解」を参照して、IOCとAOPの関連するコンテンツを簡単に理解できます。トピックにアクセスしましょう。
この記事では、SpringのAOP機能を使用するための最も簡単な例を段階的に作成します。これは、Spring AOPの初心者デモと見なされます。初心者として、このようなシンプルなデモを実行することも多くの落とし穴に見舞われています。
OOPの問題、AOPの補足
散らばったオブジェクトに公共の行動を導入する必要があるとき、OOPは無力に見えます。つまり、OOPを使用すると、上から下への関係を定義できますが、左から右への関係を定義するのに適していません。たとえば、ロギング機能。ログコードは、多くの場合、散乱するオブジェクトのコア機能に関連することなく、すべてのオブジェクトレベルに水平に散在しています。同じことは、セキュリティ、例外処理、透明性など、他のタイプのコードにも当てはまります。どこにでも散在するこの種の無関係なコードは、クロスカットコードと呼ばれます。 OOP設計では、各モジュールの再利用を助長しない多くのコード複製を引き起こします。
いわゆる「アスペクト」は、簡単に言えば、ビジネスに関連するものではなく、ビジネスモジュールと共同で呼ばれる論理または責任をカプセル化します。これにより、システムのコードの重複を減らし、モジュール間の結合を減らし、将来の運用性と保守性を促進します。
春のAOPのサポート
春のAOPエージェントは、SpringのIOCコンテナの生成と管理を担当し、その依存関係はIOC容器によっても管理されています。したがって、AOPプロキシはコンテナ内の他のBeanインスタンスを直接ターゲットにでき、この関係はIOCコンテナの依存噴射によって提供できます。 SpringはJava Dynamic Proxyを使用してデフォルトでAOPプロキシを作成するため、任意のインターフェイスインスタンスのプロキシを作成できます。プロキシを必要とするクラスがプロキシインターフェイスではない場合、SpringはCGLIBプロキシの使用に自動的に切り替わり、CGLIBを強制することもできます。
この例のロジックは次のとおりです。車のクラス(ビジネスクラス)があります。車のクラスのGOメソッドが実行される前と後、対応するログレコードがありますが、車のクラス自体はログのロジックを知りません。
Mavenプロジェクトを作成し、依存関係を追加します
まず、新しいMavenプロジェクトを作成し、MaveNarchetypequickstartテンプレートを使用してから、pom.xmlファイルを開き、Spring AOPが実行されるのに必要な依存関係パッケージを追加します。
<Dependency> groupId> org.springframework </groupid> <artifactid> spring-core </artifactid> <version> 4.0.5.Release </version> </dependency> <dependency> <shipid> org.springframework </groupid> <artifactid> spring> sprince </artifactid> <groupId> org.springframework </groupid> <artifactid> spring-context </artifactid> <version> 4.0.5.Release </version> </dependency> <dependency> groupid> org.springframework </groupId> <artifactid> spring-context </deprency> </deprency> </> </</> </> </deprency> <groupId> org.springframework </groupid> <artifactid> spring-aop </artifactid> <version> 4.0.5.Release </version> </dependency> <dependency> groupid> org.aspectj </groupId> <artifactid> aspectjweaver </artifactid> <バージョン
ビジネスコードを書く
GO()メソッドを含むビジネスクラスの車を追加しました
パッケージcom.wowo.spring_aop_demo1; public class car {public void go(){system.out.println( "Go Go Go!"); }}ファセットを書きます
ログクラスはシステムの動作を記録しますが、ログロジックはビジネスクラスのどこにでも書かれていませんが、ファセットクラスとして存在します。
パッケージcom.wowo.spring_aop_demo1; public class carlogger {public void beforerun(){system.out.println( "car is run"); } public void avterrun(){system.out.println( "car is running"); }}このアスペクトクラスには、2つの方法、つまり、前解釈と承認後の2つの方法が含まれています。
豆を介して関連を構成します
この例でbean.xmlという名前の新しい構成ファイルを追加して、構成ファイルの顔と通知を関連付けるために
<?xml version = "1.0" encoding = "utf-8"?> <beans xmlns = "http://www.springframework.org/schema/beans" xmlns:xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns:p = "http://www.springframework.org/schema/p" xmlns:context = "http://www.springframework.org/schema/context" xmlns:aop = " xsi:schemalocation = "http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www. http://www.springframework.org/schema/context/spring-context-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/spring-aop/spring- id = "car" /> <bean id = "logger" /> <aop:config> <aop:aspeed ref = "logger"> <aop:aop:aop:aop:aop:aop:aop:pointcut expression = "execution(* com.wowo.spring_aop_demo1.car.go(..))" id = "go" />> <a aftef = <aforerun " pointcut-ref = "go" method = "avterrun"/> </aop:aspect> </aop:config> </beans>
注:この構成ファイルでは、AOPの名前空間とXSIに含まれるいくつかのアドレスが必要です。
execution(* com.wowo.spring_aop_demo1.car.go(..))は、AspectJポイントカット式です。実行とは、実行中のトリガーを意味します。次の *は、あらゆるタイプの返品値を表します。 com.wowo.spring_aop_demo1.carは、ポイントカットが配置されているクラスを指します。 go(..)はメソッド名であり、...任意のパラメーターを表します。
春のセクションに適用できる5種類の通知があります。
methodメソッドが呼び出される前に、コール通知が呼び出されます
methodメソッドが正常に実行されるかどうかに関係なく、メソッドが完了した後に通知が呼び出されます。
returturning -returning-メソッドが正常に実行された後に通知が呼び出されます
shlows投げ - メソッドが例外をスローした後の通知
arout Around-Notificationは通知された方法をパッケージ化し、通知されたメソッド呼び出しの前後にカスタム動作を実行します。
ビジネスコードを実行します
以下は、ビジネスコードを実行するためのメイン()メソッドを含むクラスです
パッケージcom.wowo.spring_aop_demo1; import org.springframework.context.applicationcontext; Import org.springframework.context.support.claspathxmlapplicationcontext; public class app {public static boid main(] {approachcontex classPathXMLApplicationContext( "bean.xml");カーカー=(car)context.getBean( "car");貨物(); }}上記のコードでは、春までに車のオブジェクトが作成されます。 Springがこのオブジェクトを作成すると、そのメソッドの1つがPointCutとして構成されていることがわかります。したがって、オブジェクトをインスタンス化すると、プロキシオブジェクトが作成されます。 Point-CutメソッドGO()が実行されると、Springによって作成されたプロキシオブジェクトによって傍受されます。 GOメソッドを実行する前に、対応するPreprecess Carloggerの対応するPreprocess Beforerun()を呼び出し、Car.go()メソッドを呼び出し、セクションカットクラスCarlogger Afterrun()のポストプロセスを呼び出します。
注:スプリングは、接線を含むオブジェクトを作成するために使用する必要があります。自分で作成した場合、Springは監視できず、アプリケーションを適用してその操作は通知されません。
プロジェクトの出力結果は次のとおりです
車はランゴに行くつもりです!車は走っています
サラウンド通知を使用します
サラウンド通知を使用する場合は、アスペクトクラスの通知方法と構成ファイルを変更する必要があります。ビジネスクラスは、完全に分離されているため、変更を加える必要はありません。最初にセクションクラスのカーロガーを変更します
Intort org.aspectj.lang.proceedjoinpoint; public class carlogger {public void ourrun(proceedjoinpoint joinpoint){system.out.println( "car is run"); try {//プロキシオブジェクトのターゲットメソッドを呼び出します。この例では、car.go()メソッドjoinpoint.proceed()を指します。 } catch(throwable e){e.printstacktrace(); } system.out.println( "car is running"); }}通知を取り巻くメソッドは、型進行joinpointのパラメーターを受け入れる必要があり、そのプロセス()メソッドはプロキシオブジェクトのターゲットメソッドを呼び出すため、通常の状況では、この方法を呼び出す必要があります。また、このメソッドを呼び出さないことにより、プロキシオブジェクトの実行を整理することもできます。
次に、AOP:構成ファイルの構成部分を次のように変更します
<aop:config> <aop:asce ref = "logger"> <aop:pointcut expression = "execution(* com.wowo.spring_aop_demo1.car.go())" id = "go"/> <aop:anuft method = "run" pointcut-ref = "go"/>> <
注:サラウンド通知は、フロント/バック通知と同時に存在することはできません。コードを実行した後、出力の結果は変更されません。
要約します
上記は、Spring AOPデモの紹介についてこの記事で共有されているすべてのコンテンツです。私はそれがすべての人に役立つことを願っています。興味のある友人は、このサイトの他の関連トピックを引き続き参照できます。欠点がある場合は、それを指摘するためにメッセージを残してください。このサイトへのご支援をありがとうございました!