1. 程式人生 > >Spring 基於xml配置方式的AOP(8)

Spring 基於xml配置方式的AOP(8)

復制 calc owin img add ann frame proc message

1、ArithmeticCalculator.java

技術分享圖片
1 package com.proc;
2 
3 public interface ArithmeticCalculator {
4     int add(int i, int j);
5     int sub(int i, int j);
6     
7     int mul(int i, int j);
8     int div(int i, int j);
9 }
技術分享圖片

2、ArithmeticCalculatorImpl.java 實現接口ArithmeticCalculator

技術分享圖片
 1 package com.proc;
 2 
 3 public class ArithmeticCalculatorImpl implements ArithmeticCalculator{
 4     public int add(int i, int j) {
 5         int result = i + j;
 6         return result;
 7     }
 8 
 9     public int sub(int i, int j) {
10         int result = i - j;
11         return result;
12     }
13 
14     public int mul(int i, int j) {
15         int result = i * j;
16         return result;
17     }
18 
19     public int div(int i, int j) {
20         int result = i / j;
21         return result;
22     }
23 }
技術分享圖片

3、LoggingAspect.java 日誌切面

技術分享圖片
 1 package com.proc;
 2 
 3 import org.aspectj.lang.JoinPoint;
 4 import org.aspectj.lang.ProceedingJoinPoint;
 5 import org.aspectj.lang.annotation.After;
 6 import org.aspectj.lang.annotation.AfterReturning;
 7 import org.aspectj.lang.annotation.AfterThrowing;
 8 
 9 
10 public class LoggingAspect {
11 
12     public void beforeMethod(JoinPoint point){
13         System.out.println("正在執行方法: "+point.getSignature().getName());
14     }
15     
16 
17     public void afterMethod(JoinPoint point){
18         System.out.println("方法執行結束: "+point.getSignature().getName());
19     }
20     
21 
22     public void afterReturningMethod(JoinPoint point,Object retVal){
23         System.out.println("方法: "+point.getSignature().getName()+"執行結果為:"+retVal);
24     }
25     
26 
27     public void afterThrowingMethod(JoinPoint point,Exception ex){
28         System.out.println("執行方法: "+point.getSignature().getName()+"出現了異常:"+ex.getMessage());
29     }
30 
31     public Object aroundMethod(ProceedingJoinPoint point){
32         
33         System.out.println("環繞通知: "+point.getSignature().getName());
34         Object result=null;
35         //這裏相當於前置通知
36         try {
37             //執行方法
38             result= point.proceed();
39             //這裏相當於結果通知
40         } catch (Throwable e) {
41             //這裏相當於異常通知
42             e.printStackTrace();
43             
44         }
45         //這裏相當於後置通知
46         System.out.println("環繞通知: "+point.getSignature().getName());
47         return result;
48     }
49 }
技術分享圖片

其實這也就是一個普通類,裏面定義了寫方法

4、ValidateAspect.java 驗證切面

技術分享圖片
1 package com.proc;
2 
3 import org.aspectj.lang.JoinPoint;
4 
5 public class ValidateAspect {
6     public void beforeMethod(JoinPoint point){
7         System.out.println("驗證前置通知: "+point.getSignature().getName());
8     }
9 }
技術分享圖片

5、applicationContext.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:aop="http://www.springframework.org/schema/aop"
 5     xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
 6         http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
 7 
 8     <bean id="arithmeticCalculator" class="com.proc.ArithmeticCalculatorImpl"/>
 9     <bean id="loggingAspect" class="com.proc.LoggingAspect" />
10     <bean id="validateAspect" class="com.proc.ValidateAspect"/>
11     
12     <aop:config>
13         <!-- 配置切面表達式 -->
14         <aop:pointcut expression="execution(* *..*(..))" id="pointcut"/>
15         
16         <!-- 配置切面及通知 -->
17         <aop:aspect ref="loggingAspect" order="1">
18             <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
19             <aop:after method="afterMethod" pointcut-ref="pointcut"/>
20             <aop:after-returning method="afterReturningMethod" pointcut-ref="pointcut"  returning="retVal"/>
21             <aop:after-throwing method="afterThrowingMethod" pointcut-ref="pointcut" throwing="ex"/>
22             <aop:around method="aroundMethod" pointcut-ref="pointcut" />
23         </aop:aspect>
24         
25         <aop:aspect ref="validateAspect" order="2">
26             <aop:before method="beforeMethod" pointcut-ref="pointcut"/>
27         </aop:aspect>
28     </aop:config>
29 </beans>
技術分享圖片

  

測試代碼:

技術分享圖片
1 ApplicationContext ctx=new ClassPathXmlApplicationContext("applicationContext.xml");
2 ArithmeticCalculator calc=(ArithmeticCalculator) ctx.getBean("arithmeticCalculator");
3 System.out.println(calc.add(3, 5));
4 System.out.println(calc.sub(3, 5)); 
5 System.out.println(calc.mul(6, 2)); 
6 System.out.println(calc.div(6, 2)); 
技術分享圖片

輸出結果:

正在執行方法: add
環繞通知: add
驗證前置通知: add
環繞通知: add
方法: add執行結果為:8
方法執行結束: add
8
正在執行方法: sub
環繞通知: sub
驗證前置通知: sub
環繞通知: sub
方法: sub執行結果為:-2
方法執行結束: sub
-2
正在執行方法: mul
環繞通知: mul
驗證前置通知: mul
環繞通知: mul
方法: mul執行結果為:12
方法執行結束: mul
12
正在執行方法: div
環繞通知: div
驗證前置通知: div
環繞通知: div
方法: div執行結果為:3
方法執行結束: div

Spring 基於xml配置方式的AOP(8)