AOP编程@Pointcut、@AfterReturning、@before、@after、@around

来源:互联网 发布:windows to go 怎么用 编辑:程序博客网 时间:2024/05/16 16:23

面向切面编程AOP,前期准备工作:

引入jar包:

aspectjweaver.jar

aspectjrt.jar
cglib.jar (CBLIB的动态代理方式需要这个包)

配置文件:

<aop:aspectj-autoproxy/> 有了这个Spring就能够自动扫描被@Aspect标注的切面了,

下面这个proxy-target-class="true"表示采用CBLIB方式

<aop:aspectj-autoproxy proxy-target-class="true"/>
还要加入切面TestAspect.java:

<context:component-scan base-package="com.test.aspect"/>

TestAspect.java如下:

package com.test.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;



 //此处注解不能少
@Component
@Aspect
public class TestAspect{
public static final Logger logger = LoggerFactory.getLogger(LogAspect.class);
    @Pointcut("execution(* com.test.service.impl.*.login(..))")
public void logBefore(){
    logger.info("logBefore");
}
    @AfterReturning(pointcut = "execution(* com.test.service.impl.*.login(..))")
public void logAfter(){
    logger.info("logAfter");
}
    @Around("execution(* com.test.service.impl.*.login(..))")
    public Object logAround(ProceedingJoinPoint pjp) throws Throwable{
    logger.info("logAround");
    Object o = null;
         try {
             o = pjp.proceed();
         } catch (Throwable t) {
             // 记录返回报文
             throw t;
         }
      Object[] args=  pjp.getArgs();
      logger.info(args[0]+"logAround"+args[1]);
         return o;
}
    @Around("logBefore()")
    public Object cutAround(ProceedingJoinPoint pjp) throws Throwable{
    Object o = null;
        try {
            o = pjp.proceed();
        } catch (Throwable t) {
            // 记录返回报文
            throw t;
        }
     Object[] args=  pjp.getArgs();
     logger.info("cutAround");

     int len=args.length;
     logger.info(args[len-1]+"cutAround"+args[0]);
        return o;
    }

 // 调ServicClient切点
    @Pointcut("execution(* com.test.client.ServiceClient.request(..))&& args(request,seq,..)")
    public void serviceClient(String request, String seq) {
    }


    // 调SocketClient,request()入参为String类型的切点
    @Pointcut("execution(* com.test.client.SocketClient.request(..))&& args(request,seq)")
    public void socketStrClient(String request, String seq) {
    }


    @Around("serviceClient(request,seq)||socketStrClient(request,seq)")
    public Object doServiceClient(ProceedingJoinPoint pjp, String request, String seq) throws Throwable {

//可加上其他逻辑处理

Object o = null;
        try {
            o = pjp.proceed();
        } catch (Throwable t) {
            // 记录返回报文
            throw t;
        }
     Object[] args=  pjp.getArgs();
     logger.info("cutAround");

     int len=args.length;
     logger.info(args[len-1]+"cutAround"+args[0]);
        return o;

}

  // 调SocketClient切点
    @Pointcut("execution(* com.test.client.CardSocketClient.request(..))")
    public void cardSocketClient() {
    }
    
 // 记录后台报文日志
    @Around("cardSocketClient()&& args(sendbuf,seq,..)")   
    public Object doCardSocketClientAround(ProceedingJoinPoint pjp, byte[] sendbuf, String seq) throws Throwable {

//可加上其他逻辑处理

Object o = null;
        try {
            o = pjp.proceed();
        } catch (Throwable t) {
            // 记录返回报文
            throw t;
        }
     Object[] args=  pjp.getArgs();
     logger.info("cutAround");

     int len=args.length;
     logger.info(args[len-1]+"cutAround"+args[0]);
        return o;

  }

  // 后台DAO切点
    @Pointcut("execution(* (com.test.dao.*.*Dao" + " && !com.test.dao.carddb.*"
            + " && !com.test.dao.ubgdb.*" + " && !com.test.dao.libdb.*" + ").*(..))")
    public void dao() {
    }


    // 记录后台外调返回业务日志
    @Around("dao()&& args(seq,..)")
    public Object doDaoAround(ProceedingJoinPoint pjp, String seq) throws Throwable {

//可加上其他逻辑处理

Object o = null;
        try {
            o = pjp.proceed();
        } catch (Throwable t) {
            // 记录返回报文
            throw t;
        }
     Object[] args=  pjp.getArgs();
     logger.info("cutAround");

     int len=args.length;
     logger.info(args[len-1]+"cutAround"+args[0]);
        return o;


}
}





0 0