@Around的作用

  • 既可以在目标方法之前织入增强动作,也可以在执行目标方法之后织入增强动作;
  • 可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标目标方法的执行;
  • 可以改变执行目标方法的参数值,也可以改变执行目标方法之后的返回值; 当需要改变目标方法的返回值时,只能使用Around方法;
    • 虽然Around功能强大,但通常需要在线程安全的环境下使用。因此,如果使用普通的Before、AfterReturing增强方法就可以解决的事情,就没有必要使用Around增强处理了。

注解方式:如果需要对某一方法进行增强,只需要在相应的方法上添加上自定义注解即可

package com.rq.aop.common.advice;import com.rq.aop.common.annotation.MyAnnotation;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;@Aspect //标注增强处理类(切面类)
@Component //交由Spring容器管理
public class AnnotationAspect {/*可自定义切点位置,针对不同切点,方法上的@Around()可以这样写ex:@Around(value = "methodPointcut() && args(..)")@Pointcut(value = "@annotation(com.rq.aop.common.annotation.MyAnnotation)")public void methodPointcut(){}@Pointcut(value = "@annotation(com.rq.aop.common.annotation.MyAnnotation2)")public void methodPointcut2(){}*///定义增强,pointcut连接点使用@annotation(xxx)进行定义@Around(value = "@annotation(around)") //around 与 下面参数名around对应public void processAuthority(ProceedingJoinPoint point,MyAnnotation around) throws Throwable{System.out.println("ANNOTATION welcome");System.out.println("ANNOTATION 调用方法:"+ around.methodName());System.out.println("ANNOTATION 调用类:" + point.getSignature().getDeclaringTypeName());System.out.println("ANNOTATION 调用类名" + point.getSignature().getDeclaringType().getSimpleName());point.proceed(); //调用目标方法System.out.println("ANNOTATION login success");}
}

注解类

package com.rq.aop.common.annotation;import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;@Retention(RetentionPolicy.RUNTIME)//运行时有效
@Target(ElementType.METHOD)//作用于方法
public @interface MyAnnotation {String methodName () default "";
}

Controller

package com.rq.aop.controller;import com.rq.aop.common.annotation.MyAnnotation;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;@Controller
@RequestMapping("/hello")
public class HelloController {@RequestMapping("/login/{name}")@MyAnnotation(methodName = "login")public void login(@PathVariable String name){System.out.println("hello!"+name);}
}

运行结果:

匹配方法执行连接点方式

package com.rq.aop.common.advice;import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;@Aspect
@Component
@Order(0)  //设置优先级,值越低优先级越高
public class ExecutionAspect {@Around(value = "execution(* com.rq.aop.controller..*.*(..))")public void processAuthority (ProceedingJoinPoint point)throws Throwable{System.out.println("EXECUTION welcome");System.out.println("EXECUTION 调用方法:" + point.getSignature().getName());System.out.println("EXECUTION 目标对象:" + point.getTarget());System.out.println("EXECUTION 首个参数:" + point.getArgs()[0]);point.proceed();System.out.println("EXECUTION success");}
}

eg.

  • 任意公共方法的执行:execution(public * *(..))
  • 任何一个以“set”开始的方法的执行:execution(* set*(..))
  • AccountService 接口的任意方法的执行:execution(* com.xyz.service.AccountService.*(..))
  • 定义在service包里的任意方法的执行: execution(* com.xyz.service.*.*(..))
  • 定义在service包和所有子包里的任意类的任意方法的执行:execution(* com.xyz.service..*.*(..))

第一个表示匹配任意的方法返回值, …(两个点)表示零个或多个,第一个…表示service包及其子包,第二个表示所有类, 第三个*表示所有方法,第二个…表示方法的任意参数个数

  • 定义在pointcutexp包和所有子包里的JoinPointObjP2类的任意方法的执行:execution(*com.test.spring.aop.pointcutexp..JoinPointObjP2.*(..))")
  • pointcutexp包里的任意类: within(com.test.spring.aop.pointcutexp.*)
  • pointcutexp包和所有子包里的任意类:within(com.test.spring.aop.pointcutexp..*)
  • 实现了Intf接口的所有类,如果Intf不是接口,限定Intf单个类:this(com.test.spring.aop.pointcutexp.Intf)
  • 当一个实现了接口的类被AOP的时候,用getBean方法必须cast为接口类型,不能为该类的类型
  • 带有@Transactional标注的所有类的任意方法: @within(org.springframework.transaction.annotation.Transactional) @target(org.springframework.transaction.annotation.Transactional)
  • 带有@Transactional标注的任意方法:
    @annotation(org.springframework.transaction.annotation.Transactional)
    @within和@target针对类的注解,@annotation是针对方法的注解
  • 参数带有@Transactional标注的方法:@args(org.springframework.transaction.annotation.Transactional)
  • 参数为String类型(运行是决定)的方法: args(String)
    运行结果:
  • 切面执行顺序:

    异常:

@Around简单使用示例——SpringAOP增强处理相关推荐

  1. WCF入门(一)——简单的示例

    这篇随笔写了一段时间了,当时没有发布,今天整理文档的时候发现了,顺便给配了些图.主要是绍了一下WCF编程模型,并给了一个简单的示例. 概述 WCF框架是下一代.NET平台通信应用程序的核心.它包含了W ...

  2. 机器学习简单代码示例

    机器学习简单代码示例 //在gcc-4.7.2下编译通过. //命令行:g++ -Wall -ansi -O2 test.cpp -o test #include <iostream> u ...

  3. BizTalk 2006 简单入门示例程序(附源项目文件下载)

    BizTalk 2006 简单入门示例程序(附源项目文件下载) 为初学BizTalk Server 2006的开发人员,提供一个简单入门的示例程序,包括一个Receive Port.Send Port ...

  4. python导入txt文件并绘图-Python实现读取txt文件并画三维图简单代码示例

    记忆力差的孩子得勤做笔记! 刚接触python,最近又需要画一个三维图,然后就找了一大堆资料,看的人头昏脑胀的,今天终于解决了!好了,废话不多说,直接上代码! #由三个一维坐标画三维散点 #codin ...

  5. python读取txt文件代码-Python实现读取txt文件并画三维图简单代码示例

    记忆力差的孩子得勤做笔记! 刚接触python,最近又需要画一个三维图,然后就找了一大堆资料,看的人头昏脑胀的,今天终于解决了!好了,废话不多说,直接上代码! #由三个一维坐标画三维散点 #codin ...

  6. 【组合数学】鸽巢原理 ( 鸽巢原理简单形式示例 4、5 )

    文章目录 一.鸽巢原理简单形式示例 4 二.鸽巢原理简单形式示例 5 一.鸽巢原理简单形式示例 4 假设有 333 个 777 位二进制数 , A:a1a2a3a4a5a6a7A : a_1a_2a_ ...

  7. 【组合数学】鸽巢原理 ( 鸽巢原理简单形式 | 鸽巢原理简单形式示例 1、2、3 )

    文章目录 一.鸽巢原理简单形式 二.鸽巢原理简单形式示例 1 三.鸽巢原理简单形式示例 2 四.鸽巢原理简单形式示例 3 一.鸽巢原理简单形式 鸽巢原理 : 将 n+1n + 1n+1 个物体 放到 ...

  8. 【java开发系列】—— spring简单入门示例

    回顾 1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控 ...

  9. C#摄像头实现拍照功能的简单代码示例

    C#摄像头实现拍照功能的简单代码示例 2009-11-20  来自:网上整理字体大小:[大中小] ·摘要:这里将介绍一个C#摄像头实现拍照功能的简单代码示例,代码虽然不短,但是基本上实现了相对应的功能 ...

最新文章

  1. 贪心:Wiggle Subsequence 摇摆序列
  2. 提高CSDN阅读量。需要写出好文章。新技术的笔记!
  3. Spring3.x与jdk8兼容问题
  4. 配置Tomcat使用https协议
  5. linux中date函数的使用方法,linux date -d 的一些使用方法
  6. 【Zabbix】使用dbforbbix 2.2-beta监控Redhat 7.0上的Oracle、Mysql
  7. 14行代码满分:1037 在霍格沃茨找零钱 (20分)
  8. (转)Spring Boot通过ImportBeanDefinitionRegistrar动态注入Bean
  9. 倍受好评的美国主机JustHost使用全攻略教程
  10. Mybatis懒加载机制
  11. 常见的通配符_技术干货 | 常见的mysql注入语句
  12. 学习web前端前景怎么样?
  13. 目标追踪论文之狼吞虎咽(1):VITAL算法
  14. 视频教程-VBA从入门到精通(控件+类模块+ADO+SQL数据库)-Office/WPS
  15. 性能报告之路由器性能benchmark评估
  16. matlab 坐标轴根号,在matlab图例中如何打数学符号---根号?
  17. codeforces 1526C1 Potions (Easy Version)
  18. angular报$injector / unpr的错误
  19. 程序员如何恢复被清空的回收站——记录一下
  20. [dfs树]「CEOI 2017」One-Way Streets

热门文章

  1. 基于python的李代数实现方法
  2. pyepics --Auto-saving: simple save/restore PVs
  3. 梦幻西游手游服务器维护时间,梦幻西游手游5.11维护公告
  4. IC卡数据编辑分析软件-M1卡分析助手
  5. 华为设备Loopback Detection配置命令
  6. 制造业MES生产管理系统程序代码 MES源码
  7. 【AI实战】手把手教你深度学习文字识别(文字检测篇:基于MSER, CTPN, SegLink, EAST等方法)...
  8. java 验证码突然不显示
  9. 什么是微量元素?微量元素对人体有什么作用呢?GK
  10. 《通用数据保护条例》(GDPR)系列解读二:个人七大数据权利,企业违反或面临2000万罚款