`

springAOP

 
阅读更多

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

 

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics