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包,可能有重名的注解,如果要是不加包限制的话,那估计就会出现意想不到的效果。所以,我们就看到,那么多的切面代码,这地方的写法都是千篇一律 都是使用 && 符号。限制包,然后限制使用的是哪个注解。
spring aop 中@annotation()和自定义注解的使用相关推荐
- Spring AOP与IOC以及自定义注解
Spring AOP实现日志服务 pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId>&l ...
- Spring Aop中解析spel表达式,实现更灵活的功能
前言 在Spring Aop中,我们可以拿到拦截方法的参数,如果能结合spel表达式,就能实现更加灵活的功能.典型的实现有Spring的缓存注解: @Cacheable(value = "u ...
- springBoot AOP环绕增强、自定义注解、log4j2、MDC
(一)log4j2 maven配置 <dependency><groupId>org.springframework.boot</groupId><artif ...
- Spring AOP 中的切点是什么?如何定义切点?
Spring AOP 中的切点是什么?如何定义切点? 什么是切点? 在 Spring AOP 中,切点(Pointcut)是指一组连接点(Join Point)的集合.连接点是程序执行过程中的某个特定 ...
- Spring AOP中定义切点PointCut详解
1.AOP是什么? 软件工程有一个基本原则叫做"关注点分离"(Concern Separation),通俗的理解就是不同的问题交给不同的部分去解决,每部分专注于解决自己的问题.这年 ...
- 第十篇 Spring AOP中Load Time Weaver
文章目录 前言 一.先聊Load Time 二.再说Weaver 三.回看Load Time Weaver 四.LTW初始化过程 1.激活 2. Weave过程 总结 前言 本文介绍Spring AO ...
- Spring AOP中pointcut 切点详解
Spring AOP中pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方 ...
- 聊聊spring aop中的advisor组件
1.Advisor的组成结构 在spring aop中Advisor是一个接口,代表被拦截方法需要增强的逻辑. Advisor通常由另两个组件组成--Advice接口和Pointcut接口,其中Adv ...
- Spring AOP中是如何注册Advisor的?
前置博文: Spring AOP中如何为Bean创建代理? Spring AOP中是如何注册Advisor的? Spring AOP如何为目标方法创建拦截器链? Spring AOP拦截器调用的实现 ...
最新文章
- Android之传感器(一)
- centOS外部浏览器无法访问tomcat8000端口解决办法
- 你需要知道的Android View的布局
- HJ9 提取不重复的整数
- 计算音频数据音量_【翻译】线性的音量推子……简直像一个个秤砣!
- 利用规划图提高经典人工智能规划复杂度
- JavaScript中的位置协议属性
- java 容器 List
- IBM MQ - 连接远程队列管理器报AMQ4036错误
- 线性表顺序表模板 纯本人手工创造
- 实用的才是最好的,教你如何以MATLAB的方式实现高等应用数学问题(一)
- c语言课程设计管理系统的设计,c语言课程设计-学生管理信息系统设计.doc
- 新的开始-轩宇的c++学习之路
- 设计的银行账户管理系统,增加一个VIP账户的管理
- docker stop 失败处理方法
- CLI (命令行接口) 简易开发
- 删除Windows10系统中Wifi名称后边的数字
- 2022跨考华中科技大学计算机学院学硕上岸经验分享
- java计算机毕业设计在线影视系统源码+数据库+lw文档+系统+部署
- 问题解决:应用程序错误0xc00007b
热门文章
- java main 命令行_java Main 命令行
- sklearn机器学习实例
- [转载] 1.1Java使用JDBC原生方式连接MySql数据库
- Python默认参数
- 自定义动画属性java_创建酷炫动画效果的10个JavaScript库
- Java BigInteger类| hashCode()方法与示例
- js时间格式化通用方法
- Python对IP地址列表排序、对列表进行去重、IP地址与MAC地址组合的多个元组的列表排序
- servlet+JQuery ajax以json的形式的验证表单小实例
- JQuery Datatables —— 自定义导出列