博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
基于配置文件的方式来配置AOP
阅读量:6044 次
发布时间:2019-06-20

本文共 4920 字,大约阅读时间需要 16 分钟。

 

 

示例:

applicationContext-xml.xml:

1 
2
7 8
9
11
12 13
14
16
17 18
20
21 22
23
24
25
27
28
29
30
31
32
33
34
35
36
37
38

注:重点在代码里。

 

VlidationAspect.java:

1 package com.hk.spring.aop.xml; 2  3 import java.util.Arrays; 4  5 import org.aopalliance.intercept.Joinpoint; 6 import org.aspectj.lang.JoinPoint; 7 import org.aspectj.lang.annotation.Aspect; 8 import org.aspectj.lang.annotation.Before; 9 import org.springframework.core.annotation.Order;10 import org.springframework.stereotype.Component;11 12 13 public class VlidationAspect {14     15     public void validateArgs(JoinPoint joinPoint){16         System.out.println("-->validate:" + Arrays.asList(joinPoint.getArgs()));17     }18 19 }

 

 

LoggingAspect.java:

1 package com.hk.spring.aop.xml; 2  3 import java.util.Arrays; 4 import java.util.List; 5  6 import org.aopalliance.intercept.Joinpoint; 7 import org.aspectj.lang.JoinPoint; 8 import org.aspectj.lang.ProceedingJoinPoint; 9 import org.aspectj.lang.annotation.After;10 import org.aspectj.lang.annotation.AfterReturning;11 import org.aspectj.lang.annotation.AfterThrowing;12 import org.aspectj.lang.annotation.Around;13 import org.aspectj.lang.annotation.Aspect;14 import org.aspectj.lang.annotation.Before;15 import org.aspectj.lang.annotation.Pointcut;16 import org.springframework.core.annotation.Order;17 import org.springframework.stereotype.Component;18 19 20 public class LoggingAspect {21     22     /*23      * 定义一个方法,用于声明切入点表达式,一般该方法中再不需要加入其它代码24      */25     public void declareJointPointExpression(){26         27     }28     29     30     //声明该方法是一个前置通知:在目标方法之前执行31     public void beforeMethod(JoinPoint joinPoint){32         String methodName = joinPoint.getSignature().getName();33         List args = Arrays.asList(joinPoint.getArgs());34         System.out.println("The method " + methodName + " begins with " + args);35     }36     37     //后置通知:在目标方法执行后(无论是否发生异常),执行的通知。38     public void afterMethod(JoinPoint joinPoint){39         String methodName = joinPoint.getSignature().getName();40         System.out.println("The method " + methodName + " ends");41     }    42     43     44     /*45      * 在方法正常执行后执行的通知叫返回通知46      * 返回通知是可以访问到方法的返回值的47      */48     public void afterReturning(JoinPoint joinPoint,Object result){49         String methodName = joinPoint.getSignature().getName();50         System.out.println("The method " + methodName + " ends with " + result);51     }52     53     /*54      * 在目标方法出现异常时,会执行代码。55      * 可以访问到异常对象;且可以指定在出现特定异常时在执行通知56      */57     public void afterThrowing(JoinPoint joinPoint,Exception ex){58         String methodName = joinPoint.getSignature().getName();59         System.out.println("The method " + methodName + " coours exception : " + ex);60     }61     62     /*63      * 环绕通知需要携带ProceedingJoinPoint 类型的参数64      * 环绕通知类似于动态代理的全过程:ProceedingJoinPoint这个类型的参数可以决定是否执行目标方法65      * 且环绕通知必须有返回值,返回值即为目标方法的返回值66      */67     public Object aroundMethod(ProceedingJoinPoint pjd){68         69         Object result = null;70         String methodName = pjd.getSignature().getName();71         72         //执行目标方法73         try {74             //前置通知75             System.out.println("The method " + methodName + "begins with " + Arrays.asList(pjd.getArgs()));76             result = pjd.proceed();77             //后置通知78             System.out.println("The method " + methodName + "ends with " + result);79         } catch (Throwable e) {80             //异常通知81             System.out.println("The method occurs exception:" + e);82         }83         //后置通知84         System.out.println("The method " + methodName + " ends");85         return result;86     }87 }

 

ArithmeticCalculator.java:

1 package com.hk.spring.aop.xml;2 3 public interface ArithmeticCalculator {4     int add(int i,int j);5     int sub(int i,int j);6     int mul(int i,int j);7     int div(int i,int j);8 }

 

ArithmeticCalculatorImpl.java:

1 package com.hk.spring.aop.xml; 2  3 import org.springframework.stereotype.Component; 4  5  6 public class ArithmeticCalculatorImpl implements ArithmeticCalculator { 7  8     @Override 9     public int add(int i, int j) {10         int result = i + j;11         return result;12     }13 14     @Override15     public int sub(int i, int j) {16         int result = i - j;17         return result;18     }19 20     @Override21     public int mul(int i, int j) {22         int result = i * j;23         return result;24     }25 26     @Override27     public int div(int i, int j) {28         int result = i / j;29         return result;30     }31 32 }

 

运行结果:

 

转载于:https://www.cnblogs.com/zhzcode/p/9690971.html

你可能感兴趣的文章
企业架构研究总结(22)——TOGAF架构开发方法(ADM)之信息系统架构阶段
查看>>
linux
查看>>
C#+QQEmail自动发送邮件
查看>>
[Hadoop]MapReduce多输出
查看>>
算法(Algorithms)第4版 练习 1.3.4
查看>>
jquery easyUI checkbox复选项获取并传后台
查看>>
浅析NopCommerce的多语言方案
查看>>
设计模式之简单工厂模式
查看>>
C++中变量的持续性、链接性和作用域详解
查看>>
2017 4月5日上午
查看>>
第一阶段冲刺报告(一)
查看>>
使用crontab调度任务
查看>>
【转载】SQL经验小记
查看>>
zookeeper集群搭建 docker+zk集群搭建
查看>>
Vue2.5笔记:Vue的实例与生命周期
查看>>
论JVM爆炸的几种姿势及自救方法
查看>>
联合体、结构体简析
查看>>
使用throw让服务器端与客户端进行数据交互[Java]
查看>>
java反射与代理
查看>>
深度分析Java的ClassLoader机制(源码级别)
查看>>