AOP切点表达式及通知类参数传递方式

1.切入点表达式的写法

execution( * com.itheima.service.impl.StudentServiceImpl.findAll(…)) //较少
execution( * com.itheima.service.impl.StudentServiceImpl.(…)) //较少
execution( * com.itheima.service.StudentService.
(…)) //StudentService中的所有方法会被代理,比较常用
execution( * com…StudentService.(…)) //StudentService中的所有方法会被代理,比较常用
execution( * com…service.
.*(…)) //com包下的所有子包下的service包中的所有类的所有方法,比较常用

2.通知类型

  • 前置通知:在目标方法执行之前执行
  • 后置通知/后置返回通知:在目标方法调用之后执行
  • 异常通知/后置异常通知:在调用目标方法出现异常时执行
  • 最终通知:调用目标方法不管是否出现异常,都会执行,相当于finally中的代码
  • 环绕通知:是Spring给我们提供的一种手动调用目标对象方法或者其他通知方法的方式

以上前四种通知无法阻止目标方法调用,目标方法是由Spring来控制
环绕通知可以代替以上四种通知,但是上面四种通知不能代表环绕通知
通知使用说明:要么单独使用环绕通知,要么组合其他四种通知组合使用,两种方案二选一

3 在通知中获取目标方法的参数、返回值、异常信息

<1>前置通知中获取目标方法的参数

  • 方式一:jp.getArgs();获取数组
public void before(JoinPoint jp){//获取请求参数//doBefore(jp.getArgs());Object[] args = jp.getArgs();System.out.println("args = " + Arrays.toString(args));//前置通知:开启事务System.out.println("Advice前置通知:开启事务");
}
  • 方式二:已知参数类型,直接传递,如果目标方法没有传参,则不执行该通知方法
    对应的切点表达式的参数名/参数类型要和通知方法参数名一致,增强的目标方法参数类型要和它们一致
    “execution(* com.itheima.service.impl..(…))&&args(x)”
// 如果目标方法没有传参,则不执行@Before("execution(* com.itheima.service.impl.*.*(..))&&args(x)")public void before(int x) {//前置通知:开启事务System.out.println("前置通知:开启事务" + x);}

注:五种通知方法中都可以获取参数,前四种可以通过方式二获取

<2>后置通知中获取目标方法的结果/返回值
在这里插入图片描述
说明:后置通知方法的形参变量名要和配置中的returning="ret"属性值一样

<3>异常通知中获取异常信息
在这里插入图片描述
说明:异常通知方法的形参变量名要和配置中的throwing="err"属性值一样

<4> 环绕通知可以获取以上所有

try {//前置增强//before();//手动调用目标方法//获取切入点方法的参数Object[] args = pjp.getArgs();   //参数//执行切入点方法,也就是执行目标方法value= pjp.proceed(args); //返回值就是目标方法的返回值,结果//后置增强//afterReturn();
} catch (Throwable throwable) { //异常throwable.printStackTrace();//异常增强//afterThrowable();
} finally {}

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

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

相关文章

linux-basic(13)学习shell script

【13.1】什么是shell script&#xff1f;1&#xff09;shell script 是利用 shell 的功能所写的一个『程序 (program)』&#xff0c;这个程序是使用纯文字档&#xff0c;将一些 shell 的语法与命令(含外部命令)写在里面&#xff0c; 搭配正规表示法、管线命令与数据流重导向等功…

阿里巴巴对Java编程【集合处理】的规约

转载自 阿里巴巴对Java编程【集合处理】的规约集合处理1. 【强制】关于 hashCode 和 equals 的处理&#xff0c;遵循如下规则&#xff1a; 1&#xff09; 只要重写 equals &#xff0c;就必须重写 hashCode 。 2&#xff09; 因为 Set 存储的是不重复的对象&#xff0c;依据 ha…

http请求状态码400的原因总结

会出现这个HTTP请求状态码400&#xff0c;说明这个请求是无效的&#xff0c;并没有进入后台服务器&#xff08;控制器&#xff09;里。 通常的原因&#xff1a; 前端提交的字段名称或者字段类型和后台的实体类不一样&#xff0c;或者前端提交的参数跟后台需要的参数个数不一致…

做一个完整的Java Web项目需要掌握的技能

转自&#xff1a; https://blog.csdn.net/JasonLiuLJX/article/details/51494048--------------------------------------------------------------------------------最近自己做了几个Java Web项目&#xff0c;有公司的商业项目&#xff0c;也有个人做着玩的小项目&#xff0…

阿里巴巴对Java编程【并发处理】的规约

转载自 阿里巴巴对Java编程【并发处理】的规约并发处理1. 【强制】获取单例对象需要保证线程安全&#xff0c;其中的方法也要保证线程安全。 说明&#xff1a;资源驱动类、工具类、单例工厂类都需要注意。2. 【强制】创建线程或线程池时请指定有意义的线程名称&#xff0c;方便…

查询sql打印日志配置

mybatis-plus:mapper-locations: classpath*:mapper/*.xml# 设置别名包扫描路径&#xff0c;通过该属性可以给包中的类注册别名type-aliases-package: com.heima.model.user.pojosconfiguration:log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

js语法+dom+js图片库+最佳实践+图片库改进版

【2】js语法 【2.2.4】数据类型类型1&#xff09;字符串 var mood happy; var moood "happy"; 类型2&#xff09;数值&#xff1b; var age 33.24; 类型3&#xff09;布尔值&#xff1b;var married true; 【2.2.5】数组1&#xff09;填充方式 填充方式1&#xf…

RabbitMQ--topic

Topic类型的Exchange与Direct相比&#xff0c;都是可以根据RoutingKey把消息路由到不同的队列。只不过Topic类型Exchange可以让队列在绑定Routing key 的时候使用通配符&#xff01; Routingkey 一般都是有一个或多个单词组成&#xff0c;多个单词之间以”.”分割&#xff0c;…

阿里巴巴对Java编程【控制语句】的规约

转载自 阿里巴巴对Java编程【控制语句】的规约控制语句1. 【强制】在一个 switch 块内&#xff0c;每个 case 要么通过 break / return 等来终止&#xff0c;要么注释说明程序将继续执行到哪一个 case 为止 &#xff1b; 在一个 switch 块内&#xff0c;都必须包含一个 default…

RabbitMQ消息

如何确保RabbitMQ消息的可靠性&#xff1f; 开启生产者确认机制&#xff0c;确保生产者的消息能到达队列开启持久化功能&#xff0c;确保消息未消费前在队列中不会丢失开启消费者确认机制为auto&#xff0c;由spring确认消息处理成功后完成ack开启消费者失败重试机制&#xff…

阿里巴巴对Java编程【注释规约】的规约

转载自 阿里巴巴对Java编程【注释规约】的规约注释规约1. 【强制】类、类属性、类方法的注释必须使用 Javadoc 规范&#xff0c;使用/**内容*/格式&#xff0c;不得使用// xxx 方式。 说明&#xff1a;在 IDE 编辑窗口中&#xff0c; Javadoc 方式会提示相关注释&#xff0c;生…

动态创建标记+css_dom+js动态效果

【7】动态创建标记【7.1】一些传统方法【7.1.1】document.write方法&#xff0c;不推荐使用 &#xff08;1&#xff09;<!DOCTYPE html> <html lang"en"> <head><meta http-equiv"content-type" content"text/html; charsetutf-…

orcle安装及用户初始化

1.orcle资源 orlce安装包点击下载 2.首次安装 参照: https://jingyan.baidu.com/article/f79b7cb32095f79144023eae.html 3.卸载后安装 先卸载清除本地的orcle服务 参照: https://jingyan.baidu.com/article/6b18230943e9d7fb59e1590f.html再重新下载资源解压安装’’ 注意…

JDK8新特性之Lambda表达式

转载自 JDK8新特性之Lambda表达式 什么是Lambda表达式 Java 8的一个大亮点是引入Lambda表达式&#xff0c;使用它设计的代码会更加简洁。当开发者在编写Lambda表达式时&#xff0c;也会随之被编译成一个函数式接口。 Lambda语法 一行执行语句的写法&#xff1a; (paramete…

eclipse发布web项目到tomcat服务器

README: 使用eclipse发布web项目到tomcat有很多坑儿的。下面依依道来。 step1&#xff09;eclipse建立web 项目&#xff1a;step2&#xff09;在tomcat服务器上为该web项目配置的虚拟目录&#xff0c;即把该web项目发布到tomcat&#xff1a; tomcat的server.xml 增加如下语句&…

springboot设置默认端口访问界面

1.项目结构 2.配置方法 <1>配置类默认加载 Configuration public class WebConfigurer implements WebMvcConfigurer {Overridepublic void addViewControllers(ViewControllerRegistry registry) {//默认地址&#xff08;可以是页面或后台请求接口&#xff09;registr…

Java BigDecimal和double区别

转自&#xff1a; https://www.cnblogs.com/mingforyou/p/3344489.htmlBigDecimal类 对于不需要任何准确计算精度的数字可以直接使用float或double&#xff0c;但是如果需要精确计算的结果&#xff0c;则必须使用BigDecimal类&#xff0c;而且使用BigDecimal类也可以进行大数的…

JDK8新特性之接口默认方法与静态方法

转载自 JDK8新特性之接口默认方法与静态方法 接口默认方法与静态方法 有这样一些场景&#xff0c;如果一个接口要添加一个方法&#xff0c;那所有的接口实现类都要去实现&#xff0c;而某些实现类根本就不需要实现这个方法也要写一个空实现&#xff0c;所以接口默认方法就是为…

mybatis generator Unknown system variable 'query_cache_size' 的解决方法

出现这种错误&#xff0c;很显然是数据库驱动程序 与 数据库版本不对应&#xff1b;如 mybatis使用 mysql-5.1.10的驱动程序&#xff0c;而mybatis配置的数据源连接的是 mysql-8.0.11 &#xff0c;修改 pom文件即可&#xff0c;如下&#xff1a; <dependency><groupId…

Java NoSuchElementException: No value present 问题解决

1 问题描述 java.util.NoSuchElementException: No value 2 问题分析 2.1 Java 1、使用stream()流里面的max().get()、min().get()、findFirst().get()方法&#xff0c;由于max()、min()、findFirst()方法会返回Optional对象&#xff0c;如果Optional对象里面没有数据&#xf…