1. 启用AOP
a. 在类上添加@Aspect注解
b. 注入该类, 可以使用@Component进行注入到Spring容器中
2. 通过PointCut对象创建切入点
a. 在某个方法使用类似下面的方法进行注入
@Pointcut("execution(* com.sguess.service.IAOPService.*(..))") private void pointcut() { }
i. 其中,execution表达式为
execution(modifiers-pattern? ret-type-pattern declaring-type-pattern? name-pattern(param-pattern)throws-pattern?)
ii. 注意, pointcut()方法名是后面切入的时候需要使用的
iii. 方法内可以什么也不写, 写了也调不到
iv. 也可以创建多个PointCut,例如再创建一个
@Pointcut("execution(* com.sguess.service.IAOPService.fun1(..))") private void pointcut2() { }
这个的方法名就位pointcut2, 方法名不一样.
b. 创建After方法,Before方法
@After(value = "pointcut()") public void doAfter() { System.out.println("Do AOP After function 01"); }
i. After方法是指, 在配置了的切入点被执行后, 执行该方法.
ii. value中的pointcut() 是我们前面在创建@Pointcut中的方法名. 也就是说,是通过方法名和切入点进行匹配的.
iii. 这个的方法名可以随便起.
iv. Before方法同理
c. 带Return的After方法,
@AfterReturning(returning = "str", pointcut = "pointcut()") public void doAfterReturning(String str) throws Exception { System.out.println("Return value is: " + str); }
i. AfterReturn是指在被切入的方法执行后, 获取其返回值, 再执行该方法. 注意关键, 这个可以进行操作返回值.
ii. returning = "str",是指, 假设切入方法的返回的值变量名为str
doAfterReturning(String str)方法的参数变量名必须和和returning保持一致, 这里也叫作str. 然后才能在方法体中使用.
iii. pointcut = "pointcut()"同样是指前面声明的pointcut方法名
3. 通过注解, 使用切入点
a. 监听方法参数
@Before("execution(public int com.sguess.service.*(int, int))") public void beforMethod(JoinPoint point) { String methodName = point.getSignature().getName(); List<Object> args = Arrays.asList(point.getArgs()); System.out.println("Before FunctionName:" + methodName + ",ParameterName:" + args); } @After("execution(public int com.sguess.service.*(int, int))") public void afterMethod(JoinPoint point) { String methodName = point.getSignature().getName(); List<Object> args = Arrays.asList(point.getArgs()); System.out.println("After FunctionName:" + methodName + ",ParameterName:" + args); }
4. 执行顺序:
a.Around的方法优先于Before/After执行,After优先于AfterReturn.
i. 代码
@Before("execution(public int com.sguess.service.*.*(int, int))") public void beforMethod(JoinPoint point) { System.out.println("Before function"); } @After("execution(public int com.sguess.service.*.*(int, int))") public void afterMethod(JoinPoint point) { System.out.println("After function"); } @AfterReturning("execution(public int com.sguess.service.*.*(int, int))") public void afterReturnMethod(JoinPoint point) { System.out.println("AfterReturn function"); } @AfterThrowing(value = "execution(public int com.sguess.service.*.*(int, int))", throwing = "e") public void afterReturningThrowing(JoinPoint point, Exception e) { System.out.println("AfterReturnThrowing function"); } @Around("execution(public int com.sguess.service.*.*(int, int))") public Object aroundMethod(ProceedingJoinPoint pdj) { System.out.println("Start AroundFunction"); Object result = null; try { System.out.println("Around process start"); result = pdj.proceed(); System.out.println("Around process end"); } catch (Throwable e) { System.out.println("Around process exception"); } System.out.println("After Around process"); return result; } }
执行结果:
Start AroundFunction
Around process start
Before function
Around process end
After Around process
After function
AfterReturn function
5.小结:
@AfterReturning(returning = "str", pointcut = "pointcut()") public void doAfterReturning(String str) throws Exception { System.out.println("Return value is: " + str); } @Before("execution(public int com.sguess.service.*.*(int, int))") public void beforMethod(JoinPoint point) { String methodName = point.getSignature().getName(); List<Object> args = Arrays.asList(point.getArgs()); System.out.println("Before FunctionName:" + methodName + ",ParameterName:" + args); } @After("execution(public int com.sguess.service.*.*(int, int))") public void afterMethod(JoinPoint point) { String methodName = point.getSignature().getName(); List<Object> args = Arrays.asList(point.getArgs()); System.out.println("After FunctionName:" + methodName + ",ParameterName:" + args); } @AfterThrowing(value = "execution(public int com.sguess.service.*.*(int, int))", throwing = "e") public void afterReturningThrowing(JoinPoint point, Exception e) { String methodName = point.getSignature().getName(); List<Object> args = Arrays.asList(point.getArgs()); System.out.println("AfterReturningThrowing FunctionName:" + methodName + ",ParameterName:" + args + ",Exception:" + e); } @Around("execution(public int com.sguess.service.*.*(int, int))") public Object aroundMethod(ProceedingJoinPoint pdj) { System.out.println("Start AroundFunction"); Object result = null; try { System.out.println("Around process start"); result = pdj.proceed(); System.out.println("Around process end"); } catch (Throwable e) { System.out.println("Around process exception"); } System.out.println("After Around process"); return result; }
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对小牛知识库的支持。如果你想了解更多相关内容请查看下面相关链接
本文向大家介绍docker-registry使用笔记,包括了docker-registry使用笔记的使用技巧和注意事项,需要的朋友参考一下 相关链接 github:https://github.com/dotcloud/docker-registry api:http://docs.docker.com/reference/api/registry_api/ 安装docker-registry 官
本文向大家介绍PyMongo安装使用笔记,包括了PyMongo安装使用笔记的使用技巧和注意事项,需要的朋友参考一下 这里是简单的安装和使用记录,首先要有一个可用的mongo环境,win环境或者linux环境都可以。 假定你对mongo有所了解和知道一些命令行操作。 安装和更新 跟大多数py包安装一样,可以源码安装,也可以使用pip或者easy_install来安装 安装 升级 其他安装方法请参照文
本文向大家介绍PHP-Java-Bridge使用笔记,包括了PHP-Java-Bridge使用笔记的使用技巧和注意事项,需要的朋友参考一下 /**============================================================ * @author ken(695093513@qq.com) * @date 2014-09-09 * =========
本文向大家介绍Lab.js初次使用笔记,包括了Lab.js初次使用笔记的使用技巧和注意事项,需要的朋友参考一下 动态加载JS函数 一般性的,当我们需要加载js文件的时候都会使用script标签来实现,类似于如下代码: 但是直接使用script标签来加载js文件会有如下一些缺点: 1.严格的读取顺序。由于浏览器按照<script>在网页中出现的顺序,读取Javascript文件,然后立即运行,导致在
本文向大家介绍详解spring boot Websocket使用笔记,包括了详解spring boot Websocket使用笔记的使用技巧和注意事项,需要的朋友参考一下 本文只作为个人笔记,大部分代码是引用其他人的文章的。 在springboot项目中使用websocket做推送,虽然挺简单的,但初学也踩过几个坑,特此记录。 使用websocket有两种方式:1是使用sockjs,2是使用h5的
本文向大家介绍Python NumPy库安装使用笔记,包括了Python NumPy库安装使用笔记的使用技巧和注意事项,需要的朋友参考一下 1. NumPy安装 使用pip包管理工具进行安装 使用pip包管理工具安装ipython(交互式shell工具) 2. NumPy基础 2.1. NumPy数组对象 具体解释可以看每一行代码后的解释和输出 2.2. 数组的索引和切片 2.3. 组合数组 2.