Spring Aop之@Before、@After、@Around、@AfterReturning
在项目中使用到了@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的更多相关文章
- Spring Aop(八)——advisor标签
转发地址:https://www.iteye.com/blog/elim-2396274 8 advisor标签 advisor标签是需要定义在aspect标签里面的,其作用与aspect类似,可以简 ...
- Spring Aop实例@Aspect、@Before、@AfterReturning@Around 注解方式配置
用过spring框架进行开发的人,多多少少会使用过它的AOP功能,都知道有@Before.@Around和@After等advice.最近,为了实现项目中的输出日志和权限控制这两个需求,我也使用到了A ...
- spring aop
什么是AOP AOP(Aspect-OrientedProgramming,面向方面编程),它利用一种称为“横切”的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将 ...
- spring aop注解配置
spring aop是面向切面编程,使用了动态代理的技术,这样可以使业务逻辑的代码不掺入其他乱七八糟的代码 可以在切面上实现合法性校验.权限检验.日志记录... spring aop 用的多的有两种配 ...
- [转]彻底征服 Spring AOP 之 实战篇
Spring AOP 实战 看了上面这么多的理论知识, 不知道大家有没有觉得枯燥哈. 不过不要急, 俗话说理论是实践的基础, 对 Spring AOP 有了基本的理论认识后, 我们来看一下下面几个具体 ...
- 基于注解的Spring AOP的配置和使用
摘要: 基于注解的Spring AOP的配置和使用 AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向切面编程.可以通过预编译方式和运行期动态代理实现在不 ...
- (转)实例简述Spring AOP之间对AspectJ语法的支持(转)
Spring的AOP可以通过对@AspectJ注解的支持和在XML中配置来实现,本文通过实例简述如何在Spring中使用AspectJ.一:使用AspectJ注解:1,启用对AspectJ的支持:通过 ...
- Spring aop 原始的工作原理的理解
理解完aop的名词解释,继续学习spring aop的工作原理. 首先明确aop到底是什么东西?又如何不违单一原则并实现交叉处理呢? 如果对它的认识只停留在面向切面编程,那就脏了.从oop(Objec ...
- spring AOP应用
转自:http://wb284551926.iteye.com/blog/1887650 最近新项目要启动,在搭建项目基础架构的时候,想要加入日志功能和执行性能监控的功能,想了很多的想法,最后还是想到 ...
- Java Spring AOP用法
Java Spring AOP用法 Spring AOP Java web 环境搭建 Java web 项目搭建 Java Spring IOC用法 spring提供了两个核心功能,一个是IoC(控制 ...
随机推荐
- c# .net中的简单Job
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- EF动态linq的两种方式
网上收集的资源 我怕遗忘就在自己博客记录下,有些我忘记原文地址了请见谅 这个链接的动态sql方式是 where("c=>c.id==id") https://weblogs ...
- JavaScript编程题(含腾讯2016校招题)
作者:ManfredHu 链接:http://www.manfredhu.com/2016/04/02/15-veryGoodForUsing/ 声明:版权所有,转载请保留本段信息,否则请不要转载 几 ...
- DDoS防护之TCP防护
本文由 网易云 发布. TCP协议,相信对于每一个开发工程师都不陌生.由于该协议是一个面向连接,可靠的特性,广泛应用于现在互联网的应用中.如常见的Web.SSH.FTP等都是基于TCP协议.目前TC ...
- 栈的实现——c++
栈(stack),是一种线性存储结构,它有以下几个特点: (01) 栈中数据是按照"后进先出(LIFO, Last In First Out)"方式进出栈的. (02) 向栈中添加 ...
- hdoj1373 Channel Allocation(极大团)
题意是有若干个接收器,给出每个接收器的相邻接收器.相邻的接收器不能使用同一信号频道.问所需要的信号频道数. 求该无向图的极大团. #include<iostream> #include&l ...
- Myeclipse中java项目转成Web项目
在eclipse导入一个myeclipse建的web项目后,在Eclipse中显示的还是java项目,按下面的步骤可以将其转换成web项目. 1.找到项目目录下的.project文件 2.编辑.pro ...
- JSP知识汇总
JSP知识汇总 一.简介 > HTML - HTML擅长显示一个静态的网页,但是不能调用Java程序. > Servlet - Servlet擅长调用Java程序和后台进行交互,但是它不擅 ...
- Python中第三方库的安装
网上的帖子挺多的,教你如何安装,安装第三方工具库的方法总共分为三类:Dos系统下pip命令:安装包下载安装:IDE集成环境下安装(Pycharm,Spyder……) http://www.jiansh ...
- java文件上传-原始的Servlet方式
前言: 干了这几个项目,也做过几次文件上传下载,要么是copy项目以前的代码,要么是百度的,虽然做出来了,但学习一下原理弄透彻还是很有必要的.刚出去转了一圈看周围有没有租房的,在北京出去找房子是心里感 ...