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

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

 //切入点签名@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()和自定义注解的使用相关推荐

  1. Spring AOP与IOC以及自定义注解

    Spring AOP实现日志服务 pom.xml需要的jar <dependency><groupId>org.apache.commons</groupId>&l ...

  2. Spring Aop中解析spel表达式,实现更灵活的功能

    前言 在Spring Aop中,我们可以拿到拦截方法的参数,如果能结合spel表达式,就能实现更加灵活的功能.典型的实现有Spring的缓存注解: @Cacheable(value = "u ...

  3. springBoot AOP环绕增强、自定义注解、log4j2、MDC

    (一)log4j2 maven配置 <dependency><groupId>org.springframework.boot</groupId><artif ...

  4. Spring AOP 中的切点是什么?如何定义切点?

    Spring AOP 中的切点是什么?如何定义切点? 什么是切点? 在 Spring AOP 中,切点(Pointcut)是指一组连接点(Join Point)的集合.连接点是程序执行过程中的某个特定 ...

  5. Spring AOP中定义切点PointCut详解

    1.AOP是什么? 软件工程有一个基本原则叫做"关注点分离"(Concern Separation),通俗的理解就是不同的问题交给不同的部分去解决,每部分专注于解决自己的问题.这年 ...

  6. 第十篇 Spring AOP中Load Time Weaver

    文章目录 前言 一.先聊Load Time 二.再说Weaver 三.回看Load Time Weaver 四.LTW初始化过程 1.激活 2. Weave过程 总结 前言 本文介绍Spring AO ...

  7. Spring AOP中pointcut 切点详解

    Spring AOP中pointcut 是指那些方法需要被执行"AOP",是由"Pointcut Expression"来描述的. Pointcut可以有下列方 ...

  8. 聊聊spring aop中的advisor组件

    1.Advisor的组成结构 在spring aop中Advisor是一个接口,代表被拦截方法需要增强的逻辑. Advisor通常由另两个组件组成--Advice接口和Pointcut接口,其中Adv ...

  9. Spring AOP中是如何注册Advisor的?

    前置博文: Spring AOP中如何为Bean创建代理? Spring AOP中是如何注册Advisor的? Spring AOP如何为目标方法创建拦截器链? Spring AOP拦截器调用的实现 ...

最新文章

  1. Android之传感器(一)
  2. centOS外部浏览器无法访问tomcat8000端口解决办法
  3. 你需要知道的Android View的布局
  4. HJ9 提取不重复的整数
  5. 计算音频数据音量_【翻译】线性的音量推子……简直像一个个秤砣!
  6. 利用规划图提高经典人工智能规划复杂度
  7. JavaScript中的位置协议属性
  8. java 容器 List
  9. IBM MQ - 连接远程队列管理器报AMQ4036错误
  10. 线性表顺序表模板 纯本人手工创造
  11. 实用的才是最好的,教你如何以MATLAB的方式实现高等应用数学问题(一)
  12. c语言课程设计管理系统的设计,c语言课程设计-学生管理信息系统设计.doc
  13. 新的开始-轩宇的c++学习之路
  14. 设计的银行账户管理系统,增加一个VIP账户的管理
  15. docker stop 失败处理方法
  16. CLI (命令行接口) 简易开发
  17. 删除Windows10系统中Wifi名称后边的数字
  18. 2022跨考华中科技大学计算机学院学硕上岸经验分享
  19. java计算机毕业设计在线影视系统源码+数据库+lw文档+系统+部署
  20. 问题解决:应用程序错误0xc00007b

热门文章

  1. java main 命令行_java Main 命令行
  2. sklearn机器学习实例
  3. [转载] 1.1Java使用JDBC原生方式连接MySql数据库
  4. Python默认参数
  5. 自定义动画属性java_创建酷炫动画效果的10个JavaScript库
  6. Java BigInteger类| hashCode()方法与示例
  7. js时间格式化通用方法
  8. Python对IP地址列表排序、对列表进行去重、IP地址与MAC地址组合的多个元组的列表排序
  9. servlet+JQuery ajax以json的形式的验证表单小实例
  10. JQuery Datatables —— 自定义导出列