spring aop 中@annotation()和自定义注解的使用

在自定义个注解之后,通过这个注解,标注需要切入的方法,同时把需要的参数传到切面去。那么我们怎么在切面使用这个注解。
我们使用这个自定义注解一方面是为了传一些参数,另一方面也是为了省事。
具体怎么省事,看我下面的例子就造啦。

一般,别人的切面都是这么写的
先声明一个切入点。

	//切入点签名@Pointcut("execution(* com.lxk.spring.aop.annotation.PersonDaoImpl.*(..))")private void aa() {}

切入点声明OK之后,就是在不同的 advice 里面使用啦。一般都是如下使用。
暂时是不带注解的

//前置通知
@Before("aa()")//后置通知
@AfterReturning(value = "aa()", returning = "val")
public void afterMethod(JoinPoint joinPoint, Object val) {}//最终通知
@After("aa()")//环绕通知
@Around("aa()")//异常通知
@AfterThrowing(value = "aa()", throwing = "ex")
public void throwingMethod(Throwable ex) {}

这些切面方法里面的参数。JoinPoint joinPoint,这个是哪个都可以加的。加不加随意。需要的话就加。是可以用的。

要是带个咱自定义的注解呢
我又看到很多人都是如下写的。
我就不全部带上了,就以这个after为例,看看是如何写的吧

@After(value = "aa() && @annotation(methodLog)", argNames = "joinPoint, methodLog")
public void methodAfter(JoinPoint joinPoint, MethodLog methodLog) throws Throwable {}

按照上面这写,没毛病,因为别人都是这么写的,我也确实验证啦,这个能拿到咱定义的注解,以及注解上的参数。

还有个写法,就是不用显示的声明切入点,就是那个@Pointcut

先说下这个显示声明的好处,就像声明变量一样,因为这个切入点表达式是可以用 && || !来组合条件的,这么声明的话,可以使得代码简洁。
直接在各类 advice 通知的参数上面,使用execution来声明。
例如:

@Around(value = "(execution(* com.lxk.service..*(..))) && @annotation(methodLog)", argNames = "joinPoint, methodLog")
public Object methodAround(ProceedingJoinPoint joinPoint, MethodLog methodLog) throws Throwable {}

其实,上面的value里面的意思,就是复合那个切入的点的条件, 以&&连接,也就是说2个都符合。
既然咱自定义了注解,就是来干这个切面的,为啥还要对他是哪个包,要限制一下呢,我就把前面的给删除啦。
最终简化如下:

@Around(value = "@annotation(methodLog)")
public Object methodAround(ProceedingJoinPoint joinPoint, MethodLog methodLog) throws Throwable {}

代码依然正常运行。

既然不用加那个包的限制,这切面还是OK的,为啥还要加呢?

我稍微考虑下,估计是这么个原因:

自定义注解命名的时候,可能你取的名字很大众化,其他的jar包,也就是你项目引入的jar包,可能有重名的注解,如果要是不加包限制的话,那估计就会出现意想不到的效果。所以,我们就看到,那么多的切面代码,这地方的写法都是千篇一律 都是使用 && 符号。限制包,然后限制使用的是哪个注解。

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

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

相关文章

水系图一般在哪里找得到_进展 | 水系钠离子电池研究取得重要进展

水系钠离子电池兼具钠资源储量丰富和水系电解液本质安全的双重优势被视为一种理想的大规模静态储能技术。此前,我们针对这水系钠离子电池体系做了一些探索(Nature Communications 2015, 6, 6401;Advanced Energy Materials 2015, 5, 1501005;…

学.net还是php,ASP.NET和php哪个更容易学

ASP.NET和php哪个更容易学发布时间:2020-07-03 11:46:12来源:亿速云阅读:101作者:LeahASP.NET和php哪个更容易学?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解&a…

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

Around的作用 既可以在目标方法之前织入增强动作,也可以在执行目标方法之后织入增强动作;可以决定目标方法在什么时候执行,如何执行,甚至可以完全阻止目标目标方法的执行;可以改变执行目标方法的参数值,也…

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 …