Spring 基於xml配置方式的AOP(8)
阿新 • • 發佈:2018-08-18
復制 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)