1. 程式人生 > >spring AOP 返回後通知 簡單示例

spring AOP 返回後通知 簡單示例

開始前我們要匯入spring需要的jar包;

還需要引入 aspectjweaver.jar 和 cglib.jar 這兩個jar包

如果是maven專案的話,在pom.xml 的dependencies節點下新增如下引用即可:

Xml程式碼  收藏程式碼

<dependency>

<groupId>aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.5.3</version>

</dependency>

<dependency>

<groupId>cglib</groupId>

<artifactId>cglib</artifactId>

<version>2.2.2</version>

</dependency>

現在開始:

首先,我們定義一個工程中要用到的簡單實體Bean-- User.java

Java程式碼  收藏程式碼
  1. package org.xmy.ldq.entity;  
  2. import java.io.Serializable;  
  3. /** 
  4.  * 測試用實體 
  5.  * @author LiDuanqiang
     
  6.  */  
  7. public class User implements Serializable{  
  8.     private static final long serialVersionUID = 5752197085695030514L;  
  9.     private String id;  
  10.     private String name;  
  11.     private String password;  
  12.     private String address;  
  13.     public User() {}  
  14.     public User(String id, String name,String password,String address) {  
  15.         super();  
  16.         this.id = id;  
  17.         this.name = name;  
  18.         this.password = password;  
  19.         this.address = address;  
  20.     }  
  21.     public String getId() {  
  22.         return id;  
  23.     }  
  24.     public void setId(String id) {  
  25.         this.id = id;  
  26.     }  
  27.     public String getName() {  
  28.         return name;  
  29.     }  
  30.     public void setName(String name) {  
  31.         this.name = name;  
  32.     }  
  33.     public String getAddress() {  
  34.         return address;  
  35.     }  
  36.     public void setAddress(String address) {  
  37.         this.address = address;  
  38.     }  
  39.     public String getPassword() {  
  40.         return password;  
  41.     }  
  42.     public void setPassword(String password) {  
  43.         this.password = password;  
  44.     }  
  45. }  

 接下來定義一個通知物件:UserAdvice.java

Java程式碼  收藏程式碼
  1. package org.xmy.ldq.aop;  
  2. import org.aspectj.lang.JoinPoint;  
  3. /** 
  4.  * 使用者操作的通知物件 
  5.  * @author LiDuanqiang 
  6.  */  
  7. public class UserAdvice {  
  8.     /** 
  9.      * 主體方法返回後將執行的通知方法 
  10.      * @param JoinPoint  
  11.      * @param retValue主體方法傳遞到通知方法的返回值 
  12.      * @return 
  13.      */  
  14.     public Object afterReturning(JoinPoint joinPoint,Object retValue)throws Throwable{  
  15.         Object object = null;  
  16.         object = joinPoint.getThis();//返回代理物件  
  17.         /*切入點主體方法的名字*/  
  18.         String methodName = joinPoint.getSignature().getName();  
  19.         if (retValue instanceof Boolean && (Boolean)retValue && methodName.equals("login")) {  
  20.             System.out.println("方法:"+methodName+"()"+"成功執行;"+"登入成功!");  
  21.         }  
  22.         return object;  
  23.     }  
  24. }  

 再定義一個目標類:AOPBean.java

Java程式碼  收藏程式碼
  1. package org.xmy.ldq;  
  2. import org.xmy.ldq.entity.User;  
  3. /** 
  4.  * 主體Bean 
  5.  * @author LiDuanqiang 
  6.  */  
  7. public class AOPBean{  
  8.     public Boolean login(User user){  
  9.         Boolean ret = false;  
  10.         /*使用者名稱和密碼都為ldq則成功登入*/  
  11.         if (user.getName().equals("ldq")&&user.getPassword().equals("ldq")) {  
  12.             ret = true;  
  13.         }  
  14.         return ret;  
  15.     }  
  16. }  

 最後定義一個測試主程式的實現類:App.java

Java程式碼  收藏程式碼
  1. package org.xmy.ldq;  
  2. import org.springframework.context.support.ClassPathXmlApplicationContext;  
  3. import org.xmy.ldq.entity.User;  
  4. /** 
  5.  * 測試 
  6.  * @author LiDuanqiang 
  7.  */  
  8. public class App{  
  9.     public static void main( String[] args ){  
  10.         ClassPathXmlApplicationContext factory =  
  11.             new ClassPathXmlApplicationContext("applicationContext.xml");  
  12.         AOPBean aopBean = (AOPBean) factory.getBean("aopBean");  
  13.         aopBean.login(new User("1","ldq","ldq","cs"));  
  14.         System.exit(0);  
  15.     }  
  16. }  

 配置檔案很重要:applicationContext.xml

Xml程式碼  收藏程式碼
  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <beans xmlns="http://www.springframework.org/schema/beans"  
  3.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  4.     xmlns:context="http://www.springframework.org/schema/context"  
  5.     xmlns:aop="http://www.springframework.org/schema/aop"  
  6.     xmlns:tx="http://www.springframework.org/schema/tx"  
  7.     xmlns:p="http://www.springframework.org/schema/p"  
  8.     xsi:schemaLocation="http://www.springframework.org/schema/beans  
  9.            http://www.springframework.org/schema/beans/spring-beans-2.5.xsd  
  10.            http://www.springframework.org/schema/context  
  11.            http://www.springframework.org/schema/context/spring-context-2.5.xsd  
  12.            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd  
  13.            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">  
  14.     <aop:config>  
  15.         <!-- 定義切點 -->  
  16.         <aop:pointcut id="login_PointcutTarget"  expression="execution(* org.xmy.ldq.AOPBean.login(..))"/>  
  17.         <!-- 定義切面 -->  
  18.         <aop:aspect id="userAspect" ref="userAdvice">  
  19.             <aop:after-returning  
  20.             pointcut-ref="login_PointcutTarget"  
  21.             arg-names="joinPoint,retValue"  
  22.             returning="retValue"  
  23.             method="afterReturning"  
  24.             />  
  25.         </aop:aspect>  
  26.     </aop:config>  
  27.     <bean id="userAdvice" class="org.xmy.ldq.aop.UserAdvice"></bean>  
  28.     <bean id="aopBean" class="org.xmy.ldq.AOPBean"></bean>  
  29. </beans>  

 說明:arg-names="joinPoint,retValue" 被切目標方法的引數名稱;

Xml程式碼  收藏程式碼
  1. returning="retValue" 目標方法成功執行後的返回值 一般型別定義為 Object;  
  2. method="afterReturning"目標方法名稱  

如果程式中報出

java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$ReflectionWorldException

是aspectjweaver.jar包丟失了,將其引入即可;

 Cannot proxy target class because CGLIB2 is not available. Add CGLIB to the class path or specify proxy interfaces.錯誤 是因為採用的CGLIB代理,應把相應的jar包引入。