この記事では、SpringのAspectJアノテーションとXML構成を使用してAOPの実装を示しています
以下は、AspectJアノテーションを使用してAOPを実装するJavaプロジェクトです
1つ目は、ClassPathの下にあるApplicationContext.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:aop = "http://www.springframework.org/schema/aop" xmlns:tx = "http://www.springframework.org/schema/tx" xsi:schemalocation = "http://ww.springframework http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-ap-2.5.x. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd "> <!-Ansable jautj-autoproxy/>>>> ID = "SecurityHandler"/> </beans>
次に、サービスレイヤーインターフェイスと実装クラスがあります
パッケージcom.jadyer.Annotation;パブリックインターフェイスusermanager {public void adduser(string username、string password); public void deluser(int userid); public string finduserbyid(int userid); public void modifyuser(int userid、string username、string password); } / ***上記のusermanagerはサービスレイヤーのインターフェースです*次のusermanagerimplは、サービスレイヤーインターフェイスの実装クラス* / package com.jadyer.annotation;パブリッククラスのusermanagerimplはusermanager {public void adduser(string username、string password){system.out.println( "------- usermanagerimpl.adduser()が呼び出されました-----"); } public void deluser(int userid){system.out.println( "-------- usermanagerimpl.deluser()が呼び出されました------"); } public string finduserbyid(int userid){system.out.println( "------ usermanagerimpl.finduserbyid()が呼び出されました------"); 「鉄が顔を合わせた生活」を返します。 } public void modifyuser(int userid、string username、string password){system.out.println( "------- usermanagerimpl.modifyuser()が呼び出されました------"); }}次は、AspectJでマークされたエントリクラスです
パッケージcom.jadyer.Annotation; org.aspectj.lang.annotation.afterをインポートします。 org.aspectj.lang.annotation.aspectをインポートします。 org.aspectj.lang.annotation.pointcutをインポートします。 @Aspect Public Class SecurityHandler { /** * pointcut * @see pointcutポイントカットの名前はaddaddmethod()です。このメソッドには返品値とパラメーターがありません* @seeこのメソッドは識別子であり、*/@pointcut( "execution(* add*(..))")// add add adddmethod(){}; /***アドバイスを定義する* @seeは、私たちのアドバイスがJoinPointsに適用されるポイントカットサブスクリプションを示します*/// @before( "addaddmethod()")@after( "addaddmethod()")private void checkescurity(){system.out.println( "------【chechecurityがvoked }}最後に、クライアントテストクラス
パッケージcom.jadyer.Annotation; org.springframework.context.applicationcontextをインポートします。 import org.springframework.context.support.classpathxmlapplicationcontext; /*** AOPに対するSpringのサポート:アノテーション方法を採用* @see -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- But there is a前提条件:JDKダイナミックプロキシであるため、プロキシを生成する場合、クラスにインターフェイスを実装する必要があります* @seeは、クラスにインターフェイスがあり、スプリングのデフォルトのAOP実装を使用する場合、エラーが発生します。つまり、インターフェイス指向のプログラミング* @seeの習慣を開発します --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Andotation Support * @see * spring_home // dist // spring.jar * @shie * spring_home // lib // log4j // log4j-1.2.14.jar * spring_home // lib // jakarta-commons // commons-logging.jar *クロススライスの懸念をモジュール化し、SecurityHandler.java * @see 3を確立します。アノテーションを使用してセキュリティハンドラーをAspect * @see 4として指定します。アノテーションを使用してアドバイスとポイントカットを定義します。 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- (usermanager)factory.getbean( "usermanager"); usermanager.adduser( "Zhang Qiling"、 "02200059"); }}
以下は、XML構成ファイルを使用してAOPを実装するJavaプロジェクトです
最初は、SRCのルートディレクトリにあるApplicationContext-cglib.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:aop = "http://www.springframework.org/schema/aop" xmlns:tx = "http://www.springframework.org/schema/tx" xsi:schemalocation = "http://ww.springframework http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-ap-2.5.x. http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd "> <bean id = "usermanager"/> <bean id = "securityhandler"/> <aop:config> <aop:aspect id = "securityaspect" ref = "securityhandler"> <aop:addddmethod "expression =" execution(* add*(..) "/> <aop:" beforts "point-cut-ref ="/> < </aop:aspect> </aop:config> </beans> <! - add(*add*(..))から始まるすべてのメソッドをcom.jadyer.servcices.implパッケージの実行(*com.jadyer.servcices.impl。*(.. com.jadyer.services.impl。*。追加*(..))||実行(*com.jadyer.services.impl。*。del*(..)) - >
次に、サービスレイヤーインターフェイスと実装クラスがあります
パッケージcom.jadyer.cglib;パブリックインターフェイスusermanager {public void adduser(string username、string password); public void deluser(int userid); public string finduserbyid(int userid); public void modifyuser(int userid、string username、string password); } / ***上記のusermanagerはサービスレイヤーインターフェイスです*次のusermanagerimplは、サービスレイヤーインターフェイスの実装クラス* / package com.jadyer.cglibです。 public class usermanagerimpl {// usermanager {public void adduser(string username、string password){system.out.println( "------- usermanagerimpl.adduser()が呼び出されました-----"); } public void deluser(int userid){system.out.println( "-------- usermanagerimpl.deluser()が呼び出されました-----"); } public string finduserbyid(int userid){system.out.println( "------ usermanagerimpl.finduserbyid()が呼び出されました-----"); 「Zhang San」を返します。 } public void modifyuser(int userid、string username、string password){system.out.println( "------- usermanagerimpl.modifyuser()が呼び出されました-----"); }}次は、ApplicationContext-cglib.xmlで指定されたエントリクラスです
パッケージcom.jadyer.cglib; org.aspectj.lang.joinpointをインポートします。 /***クライアントコール情報をアドバイスに渡す* @see joinpointパラメーターをアドバイスに追加して、クライアントコールのメソッド名とパラメーター値を取得することができます。主に、Spring* @seeが提供するトランザクションを使用しています。これについて知っています。以下は、サンプルコード */ public class securityhandler {private void checksecurity(joinpoint joinpoint){for(int i = 0; i <joinpoint.getargs()。length; i ++){system.out.println(joinpoint.getargs()[i]); //クライアントによって呼び出されたメソッドのパラメーター値を取得} system.out.println(joinpoint.getSignature()。getName()); //クライアントSystem.out.println( "------ [checksecurityが呼び出される] ------")によって呼び出されたメソッド名を取得します。 }}最後に、クライアントテストクラス
パッケージcom.jadyer.cglib; org.springframework.context.applicationcontextをインポートします。 import org.springframework.context.support.classpathxmlapplicationcontext; /** * @見る ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ Since it is継承、ターゲットクラスに最終宣言を使用しないことが最善です* @seee ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------私たちのプロキシは一般的にビジネスオブジェクトであるため* @seeであるため --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- public class client {public static void main(string [] args){applicationContext Factory = new ClassPathXMLApplicationContext( "ApplicationContext-Cglib.xml"); // UsermanagerimplがUserManagerインターフェイスを実装すると、SpringはJDKダイナミックプロキシを自動的に使用します//プロジェクトがCGLIBライブラリを導入し、構成ファイルでCGLIBプロキシの使用を強制した場合、SpringはCGLIB Proxy // Usermanager Usermanager =(usermanager ")factory")factory ")の場合にのみ使用します。 // Usermanagerimplはこの時点でUserManagerインターフェイスを実装していないため、Usermanagerインターフェイスは受信タイプで使用できません。 CGLIBプロキシは構成ファイルで使用されることを余儀なくされていませんが、SpringはCGLIB Proxy Usermanagerimpl usermanager =(usermanagerimpl)factory.getbean( "usermanager")を自動的に使用します。 usermanager.adduser( "wu sansheng"、 "02200059"); }}上記はこの記事のすべての内容です。みんなの学習に役立つことを願っています。誰もがwulin.comをもっとサポートすることを願っています。