Spring 基于xml配置方式的AOP

Posted JustDo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring 基于xml配置方式的AOP相关的知识,希望对你有一定的参考价值。

我们具体用代码来说明:

 

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
3

以上是关于Spring 基于xml配置方式的AOP的主要内容,如果未能解决你的问题,请参考以下文章

[刘阳Java]_Spring AOP基于XML配置介绍_第9讲

Spring 基于xml配置方式的AOP

Spring 基于XML配置的AOP框架详细讲解

Spring 基于XML配置的AOP框架详细讲解

spring学习基于xml文件配置AOP

SPRING03_AOP的概述动态代理cglib代理相关概念基于xml配置基于注解配置