aop思想可以很好的帮助我们实现代码的解耦,比如我们之前提到的,将日志代码与业务层代码完全独立,通过spring aop的代理类进行整合。在切面类中,我们也能够通过spring提供的接口,很好的获取原切入点的相关信息。

首先,我们还是从代码着手

业务层代码StudentServiceImpl

@Service("studentService")
public class StudentServiceImpl implements StudentService {@Overridepublic int addStudent(Student student) throws Exception {System.out.println("addStudent...业务层代码执行...");return 1;}@Overridepublic int deleteStudent(Integer id) throws Exception{System.out.println("deleteStudent...业务层代码执行...");int i = 1/0;return 0;}
}

切面类StudentServiceLogger

@Aspect
@Component
public class StudentServiceLogger {@Before("execution(* com.wuwl.service.impl.StudentServiceImpl.*(..) )")public void doBefore(JoinPoint joinPoint){Object[] args = joinPoint.getArgs();String methodName = joinPoint.getSignature().getName();System.out.println(methodName+"方法执行前...");System.out.println("参数为:"+ Arrays.asList(args));}@After("execution(* com.wuwl.service.impl.StudentServiceImpl.*(..) )")public void doAfter(JoinPoint joinPoint){String methodName = joinPoint.getSignature().getName();System.out.println(methodName+"方法执行后...");}@AfterReturning(value = "execution(* com.wuwl.service.impl.StudentServiceImpl.*(..) )" , returning = "returning")public void doReturn(JoinPoint joinPoint,Object returning){String methodName = joinPoint.getSignature().getName();System.out.println(methodName+"方法返回,返回值为:"+returning);}@AfterThrowing(value = "execution(* com.wuwl.service.impl.StudentServiceImpl.*(..) )",throwing = "ex")public void doThrow(JoinPoint joinPoint,Exception ex){String methodName = joinPoint.getSignature().getName();System.out.println(methodName+"方法异常,异常信息为:"+ex.getMessage());}}

测试类AopTest

public class AopTest {ApplicationContext ac = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");@Testpublic void test1() throws Exception {StudentService studentService = ac.getBean("studentService",StudentService.class);studentService.addStudent(new Student());System.out.println("==================割===============");studentService.deleteStudent(1);}
}

最后是日志输出结果

addStudent方法执行前...
参数为:[com.wuwl.domain.Student@7e5c856f]
addStudent...业务层代码执行...
addStudent方法执行后...
addStudent方法返回,返回值为:1
==================割===============
deleteStudent方法执行前...
参数为:[1]
deleteStudent...业务层代码执行...
deleteStudent方法执行后...
deleteStudent方法异常,异常信息为:/ by zero

关于切入点方法的相关信息,spring很好的封装在了org.aspectj.lang.JoinPoint接口中,这里需要注意的是,在org.aopalliance.intercept包下,也有这样命名的一个接口,千万不要搞错了。
joinPoint.getArgs()方法可以返回切入方法的参数信息,返回值为一个数组,遍历即可获取;joinPoint.getSignature()方法的返回值为方法签名,签名接口中就包括方法名之类的信息。
如果需要在通知方法中获取切入方法的返回值,或者异常信息,则需要使用到对应注解的对应属性才行。点开@AfterReturning注解可以看到一个String returning() default "";属性,在通知方法中添加返回值参数,然后再注解中声明该参数为切入方法的返回值即可,操作方法可参考上面的代码。同理可以,使用@AfterThrowing注解的String throwing() default "";属性,可以获取到切入方法抛出的异常信息。

spring aop如何在切面类中获取切入点相关方法的参数、方法名、返回值、异常等信息相关推荐

  1. spring aop 申明了切面类之后,如何申明切入点呢?

    2019独角兽企业重金招聘Python工程师标准>>> 8.2.3 Declaring a pointcut Recall that pointcuts determine join ...

  2. spring初始化在ServletContextListener实现类中获取spring注入对象

    查了好多资料,发现还是不全,干脆自己整理吧,至少保证在我的做法正确的,以免误导读者,也是给自己做个记录吧! 由于项目须要,需在ServletContextListener监听接口实现类中调用sprin ...

  3. python调用自定义函数返回值的类型_生成dll文件以及python对DLL中函数的调用(参数类型以及返回值)...

    工具:VS2010    python2.7 (若使用的python是64位的,生成的dll也要使用x64) 系统:win7pro 64bit 首先,dll工程的创建以及dll文件的生成: new p ...

  4. java 普通类request_[Java教程]spring在普通类中获取session和request

    [Java教程]spring在普通类中获取session和request 0 2014-08-12 08:01:13 在使用spring时,经常需要在普通类中获取session,request等对像. ...

  5. Spring中的AOP——在Advice方法中获取目标方法的参数(转)

    获取目标方法的信息 访问目标方法最简单的做法是定义增强处理方法时,将第一个参数定义为JoinPoint类型,当该增强处理方法被调用时,该JoinPoint参数就代表了织入增强处理的连接点.JoinPo ...

  6. 【SpringBoot】在普通类中获取spring容器中的bean

    这段时间公司搞封闭开发,做一个联通总部的客服系统项目,是基于springboot的.在开发工程中遇到一个页面datagrid数据排序的功能,因为有多个表的数据都要用到排序功能,于是我就写了一个排序功能 ...

  7. 在普通类中获取spring容器中的bean

    在普通类中获取spring容器中的bean 1.工具类 package com.itheima.hchat.util;import org.springframework.beans.BeansExc ...

  8. java 获取继承字段_java – 从类中获取所有字段(甚至是私有的和继承的)

    我在做大学项目. 我需要从类中获取所有字段.甚至私人和继承.我试图获取所有声明字段,然后投射到超类并重复. 我的代码片段: private void listAllFields(Object obj) ...

  9. 枚举类中获取枚举值的几种方法

    在开发的过程中我们经常会定义枚举类,枚举类中获取枚举值的方式也有很多种,下面我们就探究一下大家常用的几种方式: 枚举类 public enum TestEnum {ONE(1,"one&qu ...

最新文章

  1. 2020 CCPC-Wannafly Winter Camp Day1 总结
  2. 一个完整的Web应用程序部署示例
  3. 关闭window端口445
  4. CF-241 E.Flights(差分约束)
  5. g++和gcc的区别
  6. mitmproxy抓包 | Python篡改请求参数实战(五)
  7. ffmpeg解码H.264视频数据,MFC播放视频
  8. CYYMysql 源码解读 3
  9. 高中生住校好还是走读好?为什么?
  10. 如何用敏捷搞垮一个IT团队?
  11. swagger整合springMVC
  12. SAE J1939 协议源代码分析(二)-程序移植
  13. LANP源码安装注释版
  14. 双十一大促过后怎么维护淘宝店铺数据
  15. 学计算机编程难吗,编程真的很难吗?为什么会认为学编程难?
  16. 【墨尘】变态心理学(北京大学)
  17. linux统计单拷贝基因家族,基因家族收缩和扩张分析
  18. 服务器电话销售话术,电话销售必看:让客户无法拒绝的13个经典话术
  19. centos 7使用gcc编译c语言,CentOS 7编译安装gcc 4.9.4
  20. 外包?第一份软件测试工作就一路高歌猛进,读书学Z渣一个现在生龙活虎

热门文章

  1. Javascript .map文件-JavaScript源地图
  2. 如何使用JavaScript从字符串中删除空格?
  3. 为什么在C ++中从stdin读取行比Python慢​​得多?
  4. 如何在Win11上本地显示CPU、GPU和RAM使用情况?
  5. springMVC的文件上传于下载
  6. Shiro默认拦截器
  7. Restful风格实现页面之间跳转PageController
  8. notepad出现中文显示方格处理方法
  9. Linux:VMware12.5.7安装Ubuntu16.04.2失败的解决方案cpufreq: cpufreq_online: Failed to initialize policy for cpu
  10. 计算机考试老师批卷么,【揭秘】高考答卷扫描到电脑上是啥模样?阅卷老师喜欢啥样的答卷?...