springAOP是spring框架里面一个通用的模块,项目中用来记录日志,接口调用返回的拦截记录,及纪录调用时间的性能数据,以及在部分重要接口出做入参和返回的信息记录。
现在系统学习一下springAOP的应用以及相关底层。
例如定义切入点表达式 execution (* com.sample.service.impl..*.*(..))
execution()是最常用的切点函数,其语法如下所示:
整个表达式可以分为五个部分:
1、execution(): 表达式主体。
2、第一个*号:表示返回类型,*号表示所有的类型。
3、包名:表示需要拦截的包名,后面的两个句点表示当前包和当前包的所有子包,com.sample.service.impl包、子孙包下所有类的方法。
4、第二个*号:表示类名,*号表示所有的类。
5、*(..):最后这个星号表示方法名,*号表示所有的方法,后面括弧里面表示方法的参数,两个句点表示任何参数。
xml相关配置
<aop:config> <aop:aspectref="operatorRecordInfo"> <aop:beforemethod="beforeAop" pointcut="execution(* com.sample.service.impl.*(..))"/> </aop:aspect> </aop:config> <beanclass="com.sample.service.impl.aop.OperatorRecordInfo"id="operatorRecordInfo"> <propertyname="operatorRecordService"ref="operatorRecordService"></property> </bean>
通知类型:
前置通知<aop:before>
在调用方法之前执行
public void beforeAop(JoinPoint pj) throws Throwable { System.err.println("beforeAop"); Object[] args = pj.getArgs(); StringBuilder reqStr = new StringBuilder(); for (int i = 0; i < args.length; i++) { reqStr.append("args" + i + "={" + ToStringBuilder.reflectionToString(args[i], ToStringStyle.SHORT_PREFIX_STYLE) + "}"); } }
前置通知<aop:after>
在调用方法执行结束返回之后
public void afterAop(JoinPoint pj) { System.err.println("afterAop"); Object[] args = pj.getArgs(); StringBuilder reqStr = new StringBuilder(); for (int i = 0; i < args.length; i++) { reqStr.append("args" + i + "={" + ToStringBuilder.reflectionToString(args[i], ToStringStyle.SHORT_PREFIX_STYLE) + "}"); } System.err.println(reqStr); }
后置返回通知<aop:after-returning>
在切点执行切面方法返回后执行
后置返回异常通知<aop:after-throwing>
在切点执行切面方法返回异常后执行
环绕通知<aop:around>
环绕通知和其他的通知入参有区别
环绕通知:procedingJoinPoint
其他:JoinPoint
procedingJoinPoint 是 JoinPoint的子类,字面上理解是在执行切面方法时执行的,而JoinPoint时在执行完整个切面方法的前后执行的。之前对这点未认真理解,所有使用了后置通知,业务需要纪录返回结果的纪录,调用JoinPoint的proced方法,导致切面方法又执行了一遍。
且,环绕通知的切点方法需要有返回值,这样业务才能继续往下走(相当于代理了对象后再执行)
public Object aroundAop(ProceedingJoinPoint pj) throws Throwable { Object[] requestParam = pj.getArgs(); Object result = pj.proceed(); String response = ToStringBuilder.reflectionToString(result, ToStringStyle.SHORT_PREFIX_STYLE); return result; }
参考:http://zhuchengzzcc.iteye.com/blog/1504014
相关推荐
spring aop jar 包
3、对spring aop认识模糊的,不清楚如何实现Java 自定义注解的 4、想看spring aop 注解实现记录系统日志并入库等 二、能学到什么 1、收获可用源码 2、能够清楚的知道如何用spring aop实现自定义注解以及注解的逻辑...
描述一下Spring AOP? 在Spring AOP中关注点(concern)和横切关注点(cross-cutting concern)有什么不同? AOP有哪些可用的实现? Spring中有哪些不同的通知类型(advice types)? Spring AOP 代理是什么? 引介...
基于注解实现SpringAop基于注解实现SpringAop基于注解实现SpringAop
spring aop切面拦截指定类和方法实现流程日志跟踪 一般情况下,在不侵入业务代码的情况下,需要做流程日志跟踪是比较合理的 采用springaop切面思想
springaop依赖的jar包,spring版本2.5.6,如果需要,可以下载使用,欢迎各位评论指出不足
springAOP配置实现动态代理,有利于熟悉动态代理原理,深入了解spring。
Spring AOP 入门 作者:廖雪峰
死磕Spring之AOP篇 - Spring AOP两种代理对象的拦截处理(csdn)————程序
spring aop的demo spring aop的demo
AOP的意思就是面向切面编程。本文主要是通过梳理JDK中自带的反射机制,实现 AOP动态代理模式,这也是Spring AOP 的实现原理
Spring AOP 几个不同使用方法的完整例子,使用Junit4c测试, 在我的博客上有不同配置组合的说明,可以参考
Spring源码最难问题:当Spring AOP遇上循环依赖.docx
spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop spring aop
Spring AOP的实现机制中文版,动态代理及原理,自定义类加载器
Spring AOP简单demo 入门级的 advice
Spring AOP 日志管理 实例LoggingThrowsAdvice.java
springAOP详解
spring aop 经典例子(原创),无论新手还是老手,可以快速对Spring AOP有个总体的认识。基于JDK1.6,Spring2.0.5,Eclipse IDE。
springaop多数据库读写分离