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(控制 ...
随机推荐
- python——排序
从学校毕业出来后只知道冒泡排序,发现自己对排序的了解还是很浅显. 于是在网上搜索各种排序方法,以下是本人根据索搜出来的资料再结合自己理解作出的一些简单的阐述. 如果有不正确的地方欢迎大家指正.(共同学 ...
- [转载]将json字符串转换成json对象
例如: JSON字符串: var str1 = '{ "name": "cxh", "sex": "man" }'; J ...
- go语言的null值问题
关于go语言数据库存储和显示null值的问题困扰了我很久,并且也和群友讨论过这个问题,但是都没有得到相对满意和全面的答案.最近FQ找了几篇相对详细和权威的文章,分享给大家,希望和大家一起进步,go g ...
- Windows10 家庭版添加【本地组策略编辑器】
Windows10 家庭版默认没有[本地组策略编辑器],添加方法: 新建记事本复制以下内容 @echo off pushd "%~dp0" dir /b C:\Windows\se ...
- 【cocos2d-x 手游研发小技巧(7)图片资源加密,Lua文件加密】
游戏开发中常遇到资源保护的问题. 目前游戏开发中常加密的文件类型有:图片,Lua文件,音频等文件,而其实加密也是一把双刃剑. 需要安全那就得耗费一定的资源去实现它.目前网上也有用TexturePack ...
- Docker容器的自动化监控实现
本文由 网易云 发布. 近年来容器技术不断成熟并得到应用.Docker作为容器技术的一个代表,目前也在快速发展中,基于 Docker的各种应用也正在普及,与此同时 Docker对传统的运维体系也带来 ...
- day 77 基于form组件的注册功能
Form 表单 py文件 from django import forms #定义一个form类注册用 class RegForm (forms.Form): username =forms.Char ...
- OpenSL的使用
#include <jni.h> #include <string> #include <SLES/OpenSLES.h> #include <SLES/Op ...
- FFmpeg编写的代码
//初始化解封装 av_register_all(); avformat_network_init(); avcodec_register_all(); //封装文件的上下文 ...
- 887. Super Egg Drop
You are given K eggs, and you have access to a building with N floors from 1 to N. Each egg is ident ...