@Around简单使用示例——SpringAOP增强处理

@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)
    运行结果:

  • 在这里插入图片描述

    切面执行顺序:
    在这里插入图片描述
    异常:
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/556471.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python numpy逆_Python使用numpy计算矩阵特征值、特征向量与逆矩阵

原标题:Python使用numpy计算矩阵特征值、特征向量与逆矩阵 Python扩展库numpy.linalg的eig()函数可以用来计算矩阵的特征值与特征向量,而numpy.linalg.inv()函数用来计算可逆矩阵的逆矩阵。 >>> importnumpy as np >>> x np.matrix([…

php oci8 11,linux下为php开启oci8扩展(ubuntu14亲测可用)

安装oci8扩展(php5.2-5..6请到php下载oci8-2.0.1.tgz或以下版本,php7下载oci8-2.1.1.tgz版本)这个非常重要,如果扩展包下载错了,就不会生成oci8.so这样文件,这样就无法成功安装扩展了。tar zxvf oci8-2.0.1.tgzcd oci8-2.0.1/usr/…

Mysql索引数据结构有多个选择,为什么一定要是B+树呢?_面试 (MySQL 索引为啥要选择 B+ 树)

Mysql索引数据结构 下面列举了常见的数据结构 二叉树红黑树Hash表B-Tree(B树) Select * from t where t.col5我们在执行一条查询的Sql语句时候,在数据量比较大又不加索引的情况下,逐行查询并进行比对,每次需要从磁盘…

python基础语言法则_python语言基础3

一:python函数 是组织好的,可重复使用的,用来实现单一,或相关联功能的代码块。以前使用过的一些Python提供的内建函数,如print()、max(4,18)、min(100,50)。当然我们自己创建的函数,叫做自定义函数。 ①、代…

一篇搞懂mysql中的索引(大白话版)

容易来说,索引的出现其实就是为了提升数据查询的效率,就像书的目录一样。一本 500 页的书,如果你想快速找到其中的某一个知识点,在不借助目录的情况下,那我估计你可得找一会儿。同样,对于数据库的表而言&am…

sqlite插入时间字段_sqlite 获取最后插入id

(点击上方公众号,可快速关注)SQLite数据库中的表均有一个特殊的rowid字段,它是一个不重复的64位有符号整数,默认起始值为1。rowid别名为oid或_rowid_,但在创建表的SQL声明语句中只能使用rowid作为关键字。如果在创建表的时候设置了…

Dubbo与SpringCloud的架构与区别

Dubbo与SpringCloud的架构与区别 Dubbo架构图 SpringCloud 架构图 总结 框架DubboSpringCloud服务注册中心ZookeeperSpring Cloud Netfix Eureka(nacos)服务调用方式RPCREST API服务监控Dubbo-monitorSpring Boot Admin熔断器不完善Spring Cloud Netflix Hystrix服务网关无Sp…

php全局变量的关键字,php的static关键字和全局变量

1.全局变量[其不属于面向对象的思想,因为其放在对象之外的],面向对象有一个特点,其实封装的,php希望其所有的成员都应该放在类中;php的面向对象是基于面向对象的,不是纯粹面向对象的;也就是其可…

python实训目的意义_Python实训第二天--基础知识2

列表: 定义: 在[]内,可以存放多个任意类型的值, 并以逗号隔开。 一般用于存放学生的爱好,课堂的周期等等...# 定义一个学生列表,可存放多个学生 # list([张三, 李四, 王五, 赵六]) # students [张三, 李四, 王五, 赵六] # print(…

matlab求微分数值,用MATLAB语言求微积分方程的数值解.(xd^2y)/dx^2-5dy/dx+y=0y(0)=0y'(0)=0...

function dymyfun03(x,y)dyzeros(3,1) %初始化变量dydy(1)y(2); %dy(1)表示y的一阶导数,其等于y的第二列值dy(2)5/x*y(3)-y(1); %dy(2)表示y的二阶导数%ex0808 用ode23 ode45 ode113解多阶微分方程clear,clc[x23,y23]ode23(myfun03,[1,10],[1 10 30]);[x45,y45]ode45(myfun03,[…

springboot 接口404_资深架构带你学习Springboot集成普罗米修斯

这篇文章主要介绍了springboot集成普罗米修斯(Prometheus)的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧!Prometheus 是一套开源的系统监控报警框…

http常见的状态码,400,401,403状态码分别代表什么?

2XX 成功 200 OK,表示从客户端发来的请求在服务器端被正确处理 204 No content,表示请求成功,但响应报文不含实体的主体部分 206 Partial Content,进行范围请求 3XX 重定向 301 moved permanently,永久性重定…

mysql left 数学原理,MySQL全面瓦解21(番外):一次深夜优化亿级数据分页的奇妙经历...

背景1月22号晚上10点半,下班后愉快的坐在在回家的地铁上,内心想着周末的生活怎么安排。sql忽然电话响了起来,一看是咱们的一个开发同窗,顿时紧张了起来,本周的版本已经发布过了,这时候打电话通常来讲是线上…

python网址太长_Python GUI-长链转短链

当我们想要与某人分享链接或将链接放入帖子时,如果链接太长,则会占用大量空间,而且非常缺乏吸引力。在这个时候,我们可以结束长链到短链的转换工具。当然,您可以直接搜索在线网站进行转换,但我们可以使用它…

java8中的map与flatmap区别

map:只能返回一个值 flatmap:返回多个值 new ArrayList().stream().map(x -> x);//返回一个 new ArrayList().stream().flatMap(x -> Arrays.asList(x.split(" ")).stream());//返回一个流,也就是多个值 看API声明可以发现,flatmap接受的参数是流…

matlab用高斯消元法解线性方程组,用matlab利用高斯消元法求解线性方程组

用matlab利用高斯消元法求解线性方程组Tag内容描述:1、用C语言编写软件完成以下任务:请用高斯列主元消元法解下列线性方程组:方法说明(以4阶为例):第1步消元在增广矩阵(A,b)第一列中找到绝对值最大的元素,将…

shell 文件路径有空格_Python学习第57课-shell入门之基本简单命令(一)

【每天几分钟,从零入门python编程的世界!】我们现在学习shell操作,对于shell的命令,我们就把它看做新的语言,shell语言,它是不同于其他编程语言的。就像我们学习一门编程语言,都是从打出“hell …

比较Spring AOP和AspectJ

1. 介绍 当前有多个可用的AOP库,这些库必须能够回答许多问题: 它与我现有的或新的应用程序兼容吗?在哪里可以实施AOP?它与我的应用程序集成的速度有多快?性能开销是多少? 在本文中,我们将着眼…

matlab中有哪些输出函数,MATLAB中查找并输出的函数有什么

程序如下:function Rusername(S)%S为用户名的字符串if ~isstr(S)error(Input argument is not string.);end%读取数据[Ad,At]xlsread(final exam-mini project-database.xlsx,Students);AAt(3:end,1:end);pisnan(Ad);pofind(p(1,:));Admat2cell(Ad,ones(1,size(Ad,1…

hough变换直线检测_python+opencv实现霍夫变换检测直线

作者:Ruff_XY功能:创建一个滑动条来控制检测直线的长度阈值,即大于该阈值的检测出来,小于该阈值的忽略 注意:这里用的函数是HoughLinesP而不是HoughLines,因为HoughLinesP直接给出了直线的断点,…