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(控制 ...
随机推荐
- 【加密算法】DES
一.简介 DES对称加密,是一种比较传统的加密方式,其加密运算.解密运算使用的是同样的密钥,信息的发送者和信息的接收者在进行信息的传输与处理时,必须共同持有该密码(称为对称密码),是一种对称加密算法. ...
- 【NumberValidators】增值税发票代码验证
同大陆身份证验证一样,该部分是按照国家增值税发票代码的定制规则,进行发票代码验证,如果需要查验发票信息是否正确,应该通过第三方接口(大约一毛钱查验一次),或者直接上国家税务总局全国增值税发票查验平台进 ...
- Effective Java(1)-创建和销毁对象
Effective Java(1)-创建和销毁对象
- JavaScript获取某年某月有多少天以及第一天是星期几
function getDaysWeekady(year,month) { var date = new Date(year, month-1, 1);//月份是0-11 var date2 = ne ...
- Sorted方法排序用法
listA = [3,4,5,3,2,1,] print(sorted(listA)) # [1, 2, 3, 3, 4, 5] listB =["a","z" ...
- What are rules about using an underscore in a c identifier
http://stackoverflow.com/questions/228783/what-are-the-rules-about-using-an-underscore-in-a-c-identi ...
- mysql中date,datetime,timestamp数据类型区别
(1)date表示日期,其范围为1000-01-01到9999-12-31 (2)datetime表示日期时间,其范围是1000-01-01 00:00:00到9999-12-31 23:59:59 ...
- 一次对webshell的后门的查看
本文作者i春秋作家——非主流 昨天晚上突发奇想的想去看看github上面tennc的webshell收集项目中的shell有没有漏洞,比如未授权啊啥的,结果找半天都没找到...但是机缘巧合下,居然给我 ...
- docker镜像基本操作一
获取镜像 首先说明一下如何从Docker hub中获取高质量的镜像,从Docker镜像库获取镜像的命令是docker pull .其命令格式为: docker pull [选项] [Docker Re ...
- checkbox选中事件
在前端中,往往需要根据后台数据的返回选中多选框.可以根据后台返回的数据转化为数组,然后又val([数组])进行选中. 例子: html代码: <!DOCTYPE html> <htm ...