动态代理四种增强方式

先创建一个service类

  1. package com.zzj.calculatar.service;
  2. import org.springframework.stereotype.Service;
  3.  
  4. @Service
  5. public class CalculatorService implements ICalculatorService{
  6.  
  7. @Override
  8. public int mul(int a, int b) {
  9. return a*b;
  10. }
  11.  
  12. @Override
  13. public int div(int a, int b) {
  14. return a/b;
  15. }
  16.  
  17. }

XML文件

  1. <context:component-scan base-package="com.zzj"></context:component-scan>
  2. <aop:aspectj-autoproxy></aop:aspectj-autoproxy>

四种增强:前置增强,后置增强,返回增强,异常增强

  1. @Order(1)//切片执行顺序,默认为字典顺序
  2. @Aspect
  3. @Component
  4. public class CalculatorAspect {
  5.  
  6. @Pointcut("execution(public int com.zzj.calculatar.service.CalculatorService.*(..))")
  7. public void pointCut(){
  8.  
  9. }
  10.  
  11. //前置增强:目标方法执行之前先调用增强方法
  12. @Before("pointCut()")
  13. public void before(JoinPoint jp){
  14. //获取参数
  15. Object [] args = jp.getArgs();
  16. //获取方法名
  17. Signature signature = jp.getSignature();
  18. String name = signature.getName();
  19.  
  20. System.out.println("The "+ name +" method begins.");
  21. System.out.println("Parameters of the "+name+" method["+args[0]+","+args[1]+"]");
  22. }
  23.  
  24. //后置增强:目标方法执行之后调用增强方法
  25. @After("pointCut()")
  26. public void after(JoinPoint jp){
  27. //获取方法名
  28. Signature signature = jp.getSignature();
  29. String name = signature.getName();
  30. System.out.println("The "+ name +" method ends.");
  31. }
  32.  
  33. //返回增强:目标方法执行return之后返回结果之前调用增强方法,如果出异常则不执行
  34. @AfterReturning(value="pointCut()",returning = "result")
  35. public void afterReturning(JoinPoint jp,Object result){
  36. //获取方法名
  37. Signature signature = jp.getSignature();
  38. String name = signature.getName();
  39. System.out.println("The "+ name +" method results:"+result);
  40. }
  41.  
  42. //异常增强:目标方法执行产生异常调用增强方法
  43. @AfterThrowing(value="pointCut()",throwing = "e")
  44. public void afterReturning(JoinPoint jp,Exception e){
  45. //获取方法名
  46. Signature signature = jp.getSignature();
  47. String name = signature.getName();
  48. System.out.println("The "+ name +" method exception:"+e);
  49. }
  50. }

测试类:

  1. public class Test {
  2.  
  3. public static void main(String[] args){
  4.  
  5. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
  6. ICalculatorService calculatorService = applicationContext.getBean(ICalculatorService.class);
  7. System.out.println(calculatorService.getClass());//当有代理类时,获取的代理对象
  8. System.out.println(calculatorService.div(1,1));
  9. applicationContext.close();
  10.  
  11. }
  12.  
  13. }

测试结果:

当把除法的分母1改为0出现异常时,测试结果:

环绕增强,包含前面四种增强

  1. @Order(1)//切片执行顺序,默认为字典顺序
  2. @Aspect
  3. @Component
  4. public class CalculatorAspect {
  5.  
  6. @Pointcut("execution(public int com.zzj.calculatar.service.CalculatorService.*(..))")
  7. public void pointCut(){
  8.  
  9. }
  10. //环绕增强
  11. @Around(value="pointCut()")
  12. public Object around(ProceedingJoinPoint joinPoint){
  13. Object result = null;
  14. Object target = joinPoint.getTarget();//目标对象
  15. String methodName = joinPoint.getSignature().getName();
  16. Object[] params = joinPoint.getArgs();
  17.  
  18. try{
  19. try{
  20. //前置增强
  21. System.out.println(target.getClass().getName()+": The "+methodName+" method begins.");
  22. System.out.println(target.getClass().getName()+": Parameters of the "+methodName+"method: ["+params[0]+","+params[1]+"]");
  23. //执行目标对象内的方法
  24. result = joinPoint.proceed();
  25. }finally{
  26. //后置增强
  27. System.out.println(target.getClass().getName()+":The "+methodName+" method ends.");
  28. }
  29. //返回增强
  30. System.out.println(target.getClass().getName()+":Result of the "+methodName+" method:"+result);
  31. }catch (Throwable e) {
  32. System.out.println(target.getClass().getName()+":Exception of the method "+methodName+": "+e);
  33. }
  34. return result;
  35. }
  36.  
  37. }

测试类:

  1. public class Test {
  2.  
  3. public static void main(String[] args){
  4.  
  5. ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
  6. ICalculatorService calculatorService = applicationContext.getBean(ICalculatorService.class);
  7. System.out.println(calculatorService.getClass());//当有代理类时,获取的代理对象
  8. System.out.println(calculatorService.div(1,1));
  9. applicationContext.close();
  10.  
  11. }
  12.  
  13. }

测试结果:

当把除法分母1改为0,报错时测试结果如下:

AOP五种执行时机的更多相关文章

  1. spring aop 的五种通知类型

    本文转自:http://blog.csdn.net/cqabl/article/details/46965197 spring aop通知(advice)分成五类: 前置通知[Before advic ...

  2. Java 字符串拼接 五种方法的性能比较分析 从执行100次到90万次

    [请尊重原创版权,如需引用,请注明来源及地址] > 字符串拼接一般使用“+”,但是“+”不能满足大批量数据的处理,Java中有以下五种方法处理字符串拼接,各有优缺点,程序开发应选择合适的方法实现 ...

  3. C#中得到程序当前工作目录和执行目录的五种方法

    string str="";str += "\r\n" + System.Diagnostics.Process.GetCurrentProcess().Mai ...

  4. Spring AOP四种实现方式Demo详解与相关知识探究

    一.前言 在网络上看到一篇博客Spring实现AOP的4种方式,博主写的很通俗易懂,但排版实在抓狂,对于我这么一个对排版.代码格式有强迫症的人来说,实在是不能忍受~~~~(>_<)~~~~ ...

  5. 补习系列(7)-springboot 实现拦截的五种姿势

    目录 简介 姿势一.使用 Filter 接口 1. 注册 FilterRegistrationBean 2. @WebFilter 注解 姿势二.HanlderInterceptor 姿势三.@Exc ...

  6. Spring事务配置的五种方式 巨全!不看后悔,一看必懂!

    前段时间对Spring的事务配置做了比较深入的研究,在此之间对Spring的事务配置虽说也配置过,但是一直没有一个清楚的认识.通过这次的学习发觉Spring的事务配置只要把思路理清,还是比较好掌握的. ...

  7. Spring事务配置的五种方式和spring里面事务的传播属性和事务隔离级别

    转: http://blog.csdn.net/it_man/article/details/5074371 Spring事务配置的五种方式 前段时间对Spring的事务配置做了比较深入的研究,在此之 ...

  8. Spring-AOP的五种通知和切面的优先级、通知变量声明

    SpringAOP的通知分为以下五种: 1前置通知(@before)在连接点执行之前执行的代码 2后置通知(@after)在连接点执行之后执行的代码,不管连接点执行后是否出现异常,后置通知都会执行,但 ...

  9. 简述linux同步与异步、阻塞与非阻塞概念以及五种IO模型

    1.概念剖析 相信很多从事linux后台开发工作的都接触过同步&异步.阻塞&非阻塞这样的概念,也相信都曾经产生过误解,比如认为同步就是阻塞.异步就是非阻塞,下面我们先剖析下这几个概念分 ...

随机推荐

  1. RTU:EvalRightToUse License for feature adventerprise 1.0 will transition to RightToUse in 10 days. UDI ASR1002-X:JAE2100XXXX

    关于这个log:[Hostname] EvalRightToUse License for feature adventerprise 1.0 will transition to RightToUs ...

  2. kudu-master服务启动失败

    执行service kudu-master start ,  提示启动失败failed. 进入报错日志目录  (cd /var/log/kudu/),看到报错信息(vim kudu-master.ER ...

  3. vue 项目中的less

    收先要在cmd中运行 npm install less less-loader --save 然后会在 moudules文件夹中生成less 和less-loader <style lang=& ...

  4. 「Luogu P1975 [国家集训队]排队」

    题目大意 给出一个序列 \(h\),支持交换其中的两数,求出每一时刻的逆序对个数. 分析 求逆序对是 \(O(N\log_2N)\) 的,有 \(M\) 个操作,如果暴力求的话时间复杂度就是 \(O( ...

  5. [ DLPytorch ] 批量归一化与残差网络

    批量归一化 通常来说,数据标准化预处理对于浅层模型就足够有效了.随着模型训练的进行,当每层中参数更新时,靠近输出层的输出较难出现剧烈变化.但对深层神经网络来说,即使输入数据已做标准化,训练中模型参数的 ...

  6. word2vec词向量处理中文语料

    word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间 ...

  7. 5-2 使用antDesign的Table 及 modal(对话情景框) 功能

    1,进入antDesign官网,粘贴table代码 2,看代码各个部分实现什么功能,根据需求改代码 表格类似如下: 代码如下: const columns = [ { title: 'Name', d ...

  8. 访问HDFS文件系统

    一.命令行接口 默认操作的是hdfs hadoop dfsadmin -safemode leave/enter---离开或进入安全模式 hadoop fs -copyFromLocal    loc ...

  9. Codeforces Round #585 (Div. 2)E(状态压缩DP,思维)

    #define HAVE_STRUCT_TIMESPEC #include<bits/stdc++.h>using namespace std;long long n,x;long lon ...

  10. Caused by: android.view.WindowManager$BadTokenException: Unable to add window -- token null is not for an application

    在广播中启动一个Dialog时出现如下错误信息:Caused by: android.view.WindowManager$BadTokenException: Unable to add windo ...