动态代理四种增强方式

先创建一个service类

package com.zzj.calculatar.service;
import org.springframework.stereotype.Service; @Service
public class CalculatorService implements ICalculatorService{ @Override
public int mul(int a, int b) {
return a*b;
} @Override
public int div(int a, int b) {
return a/b;
} }

XML文件

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

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

@Order(1)//切片执行顺序,默认为字典顺序
@Aspect
@Component
public class CalculatorAspect { @Pointcut("execution(public int com.zzj.calculatar.service.CalculatorService.*(..))")
public void pointCut(){ } //前置增强:目标方法执行之前先调用增强方法
@Before("pointCut()")
public void before(JoinPoint jp){
//获取参数
Object [] args = jp.getArgs();
//获取方法名
Signature signature = jp.getSignature();
String name = signature.getName(); System.out.println("The "+ name +" method begins.");
System.out.println("Parameters of the "+name+" method["+args[0]+","+args[1]+"]");
} //后置增强:目标方法执行之后调用增强方法
@After("pointCut()")
public void after(JoinPoint jp){
//获取方法名
Signature signature = jp.getSignature();
String name = signature.getName();
System.out.println("The "+ name +" method ends.");
} //返回增强:目标方法执行return之后返回结果之前调用增强方法,如果出异常则不执行
@AfterReturning(value="pointCut()",returning = "result")
public void afterReturning(JoinPoint jp,Object result){
//获取方法名
Signature signature = jp.getSignature();
String name = signature.getName();
System.out.println("The "+ name +" method results:"+result);
} //异常增强:目标方法执行产生异常调用增强方法
@AfterThrowing(value="pointCut()",throwing = "e")
public void afterReturning(JoinPoint jp,Exception e){
//获取方法名
Signature signature = jp.getSignature();
String name = signature.getName();
System.out.println("The "+ name +" method exception:"+e);
}
}

测试类:

public class Test {

    public static void main(String[] args){

        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
ICalculatorService calculatorService = applicationContext.getBean(ICalculatorService.class);
System.out.println(calculatorService.getClass());//当有代理类时,获取的代理对象
System.out.println(calculatorService.div(1,1));
applicationContext.close(); } }

测试结果:

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

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

@Order(1)//切片执行顺序,默认为字典顺序
@Aspect
@Component
public class CalculatorAspect { @Pointcut("execution(public int com.zzj.calculatar.service.CalculatorService.*(..))")
public void pointCut(){ }
//环绕增强
@Around(value="pointCut()")
public Object around(ProceedingJoinPoint joinPoint){
Object result = null;
Object target = joinPoint.getTarget();//目标对象
String methodName = joinPoint.getSignature().getName();
Object[] params = joinPoint.getArgs(); try{
try{
//前置增强
System.out.println(target.getClass().getName()+": The "+methodName+" method begins.");
System.out.println(target.getClass().getName()+": Parameters of the "+methodName+"method: ["+params[0]+","+params[1]+"]");
//执行目标对象内的方法
result = joinPoint.proceed();
}finally{
//后置增强
System.out.println(target.getClass().getName()+":The "+methodName+" method ends.");
}
//返回增强
System.out.println(target.getClass().getName()+":Result of the "+methodName+" method:"+result);
}catch (Throwable e) {
System.out.println(target.getClass().getName()+":Exception of the method "+methodName+": "+e);
}
return result;
} }

测试类:

public class Test {

    public static void main(String[] args){

        ClassPathXmlApplicationContext applicationContext = new ClassPathXmlApplicationContext("application.xml");
ICalculatorService calculatorService = applicationContext.getBean(ICalculatorService.class);
System.out.println(calculatorService.getClass());//当有代理类时,获取的代理对象
System.out.println(calculatorService.div(1,1));
applicationContext.close(); } }

测试结果:

当把除法分母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. MYSQL---外键 primary key 作用

    https://www.cnblogs.com/x739400043/p/4732158.html 外键和级联   关于外键写的不错的网址:http://blog.csdn.net/lidaasky/ ...

  2. HDU 4699 Editor(模拟 对顶栈)

    题目大意: 给定一个整数序列 维护5种操作 次数<1e6 I x: 光标位置插入x 然后光标位于x之后 D: 删除光标前一个数 L: 光标左移 R: 光标右移 Q k: 询问位置k之前的最大前缀 ...

  3. ConcurrentHashMap 结构 1.7 与1.8

    1.结构 1.7 segment+HashEntity+Unsafe 1.8 移除Segment,使锁的粒度更小,Synchronized+CAS+Node+Unsafe 2. put() 1.7 先 ...

  4. 【PAT甲级】1060 Are They Equal (25 分)(需注意细节的模拟)

    题意: 输入一个正整数N(<=100),接着输入两个浮点数(可能包含前导零,对于PAT已经习惯以string输入了,这点未知),在保留N位有效数字的同时判断两个数是否相等,并以科学计数法输出. ...

  5. Pytorch-Faster-RCNN 中的 MAP 实现 (解析imdb.py 和 pascal_voc.py)

    ---恢复内容开始--- MAP是衡量object dectection算法的重要criteria,然而一直没有仔细阅读相关代码,今天就好好看一下: 1. 测试test过程是由FRCN/tools/t ...

  6. iOS开发架构学习记录

    闲着没事看了一些iOS开发架构的视频,简单的介绍了几个常用的架构设计,现将它记录如下,以后有时间再专门写这方面的内容,大家可以看看,感兴趣的就进一步学习. 一.架构基础 1.架构设计的目的 进一步解耦 ...

  7. 安装luarocks安装驱动

    yum install libtermcap-devel ncurses-devel libevent-devel readline-devel--安装lua前提条件 LuaSQL 可以使用 LuaR ...

  8. 吴裕雄 Bootstrap 前端框架开发——Bootstrap 排版:使段落突出显示

    <!DOCTYPE html> <html> <head> <title>菜鸟教程(runoob.com)</title> <meta ...

  9. git github 对代码的管理

    参考:https://www.cnblogs.com/feynman61/p/9005252.html 一.Git 对远程仓库版本回退 场景: 同事 a.b 同时修改了代码,提交到仓库 同时 c 不熟 ...

  10. 3_03_MSSQL课程_Ado.Net_登录复习和ExcuteScalar

    SQL注入 ->登陆窗体破解 ->配置文件 ->首先在 app.Config文件中添加 节点,如下: <connectionStrings> <add name=& ...