在项目中使用到了@Aspect注解,故研究了下与其配套的几个注解,将测试结果记录下来

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component; @Component
@Aspect
public class TestAspect { private static final Logger logger = LoggerFactory.getLogger(TestAspect.class); @Pointcut("execution(public * com.xwj.service..*.insert*(..))")
private void recordLog() { } /**
* 前置方法,在目标方法执行前执行
*
* @param joinPoint
*/
@Before("recordLog()")
public void before(JoinPoint joinPoint) {
logger.info("保存前方法:beforeSave");
} /**
* 后置方法,在目标方法执行后执行
*
* @param joinPoint
*/
@After("recordLog()")
public void after(JoinPoint joinPoint) {
logger.info("保存后方法:afterSave()");
} @Around("recordLog()")
public Object around(ProceedingJoinPoint joinPoint) {
Object obj = null;
try {
logger.info("around前");
joinPoint.proceed();
logger.info("around后");
} catch (Throwable e) {
logger.info("aop异常");
}
return obj;
} @AfterReturning(returning = "retObj", pointcut = "recordLog()")
public void doAfterReturning(Object retObj) throws Throwable {
// 处理完请求,返回内容
logger.info("返回值 : " + retObj);
}

在上面代码中,@Pointcut注解中execution表达式的意思就是com.xwj.service包下的所有子类中的以insert为前缀的方法

关于@Pointcut注解中,execution表达式的使用,可以参考AspectJ的切入点表达式---execution表达式详解

发送请求,调用service中的insert方法,执行结果如下:

-- ::49.610  INFO  --- [nio--exec-] com.xwj.aop.TestAspect                   : around前
-- ::49.610 INFO --- [nio--exec-] com.xwj.aop.TestAspect : 保存前方法:beforeSave
-- ::49.627 INFO --- [nio--exec-] com.xwj.aop.TestAspect : around后
-- ::49.627 INFO --- [nio--exec-] com.xwj.aop.TestAspect : 保存后方法:afterSave()
-- ::49.627 INFO --- [nio--exec-] com.xwj.aop.TestAspect : 返回值 : null

通过打印出的结果可以看到,这几个注解的执行顺序:

  1、进入的是@Around中

  2、joinPoint.proceed()方法,进入到@Before

  3、@Before执行完后,又回到@Around

  4、@Around执行完后,进入到@After

  5、最后执行@AfterReturning

Spring Aop之@Before、@After、@Around、@AfterReturning的更多相关文章

  1. Spring Aop(八)——advisor标签

    转发地址:https://www.iteye.com/blog/elim-2396274 8 advisor标签 advisor标签是需要定义在aspect标签里面的,其作用与aspect类似,可以简 ...

  2. Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置

    用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before.@Around和@After等advice.最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了A ...

  3. spring aop

    什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...

  4. spring aop注解配置

    spring aop是面向切面编程,使用了动态代理的技术,这样可以使业务逻辑的代码不掺入其他乱七八糟的代码 可以在切面上实现合法性校验.权限检验.日志记录... spring aop 用的多的有两种配 ...

  5. [转]彻底征服 Spring AOP 之 实战篇

    Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...

  6. 基于注解的Spring AOP的配置和使用

    摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...

  7. (转)实例简述Spring AOP之间对AspectJ语法的支持(转)

    Spring的AOP可以通过对@AspectJ注解的支持和在XML中配置来实现,本文通过实例简述如何在Spring中使用AspectJ.一:使用AspectJ注解:1,启用对AspectJ的支持:通过 ...

  8. Spring aop 原始的工作原理的理解

    理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...

  9. spring AOP应用

    转自:http://wb284551926.iteye.com/blog/1887650 最近新项目要启动,在搭建项目基础架构的时候,想要加入日志功能和执行性能监控的功能,想了很多的想法,最后还是想到 ...

  10. Java Spring AOP用法

    Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...

随机推荐

  1. ASP.NET网页VS利用文件系统发布

    1.点击发布 2.选择发布方式,这里选择文件系统,并选择发布的路径 3.配置相关参数 4.点击发布按钮 5.发布成功后文件夹下生成的文件 ..

  2. C# volatile 关键字

    volatile 就像大家更熟悉的const一样,volatile是一个类型修饰符(type specifier).它是被设计用来修饰被不同线程访问和修改的变量.如果不加入volatile,基本上会导 ...

  3. Android studio项目预览的时候提示错误ActionBarOverlayLayout

    android studio打开项目(别人的demo),提示页面没法预览.截图如下 根据查询,是主题没法正常显示,需要修改样式.样式文件的路径为res\values\styles.xml,截图如下. ...

  4. sql server 修改表字段信息

    alter table oa_archives_folder alter column folder_category varchar(200)

  5. wpf expender 展开动画

    非原创,网上下载的,觉得还可以,记录一下以便以后查看学习 <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2 ...

  6. C#通过rdp账密直接打开远程桌面

    思路是首先新建一个vbs脚本,再创建一个bat脚本,再创建rdp文件,运行顺序是vbs->bat->rdp.rdp文件里面包含远程电脑的账密和其它信息,这样就可以不用再输入账密,而在程序里 ...

  7. Django signal 信号机制的使用

    Django中提供了"信号调度",用于在框架执行操作时解耦,当某些动作发生的时候,系统会根据信号定义的函数执行相应的操作 一.Django中内置的 signal 类型主要包含以下几 ...

  8. django orm 以列表作为筛选条件进行查询

    在Django的orm中进行查询操作时,可以通过传入列表,列表内的元素为索引值,作为一个筛选条件来进行行查询 from .models import UserInfo user_obj = UserI ...

  9. Java的HashMap

    FAQ: 为什么要有HashMap? 答:我非常期待能在Java 中使用Hash表 这种数据结构 ,因为它的快速存取特性. Hash表 和HashMap的关系? 答:Hash表 是一种逻辑数据结构,H ...

  10. git忽略掉文件权限检查

    有时 git diff 执行显示文件内容没变化,但是有 old mode xxx new mode,原因是文件的权限,被chmod变化了,这种变化也被 diff 识别出来了,让git忽略掉文件权限检查 ...