Spring AOP的快速使用

2020-09-02  本文已影响0人  Rogue_bbb1

开启AspectJ支持

首先需要开启AspectJ的支持,使用@EnableAspectJAutoProxy注解

@Configuration
@EnableAspectJAutoProxy
public class AspectJConfig {
}

@Configuration是将类标记为配置类

定义Aspect

Aspect可以作为一个AOP逻辑的单元,里面可以定义切点和切面

@Component
@Aspect
public class ControllerLogAspect {
}

没有@Component会导致类没有被Spring加载从而导致定义的AOP方法没有被执行

定义Pointcut

@Component
@Aspect
public class ControllerLogAspect {

    @Pointcut("within(com.zww.demo.controller..*)")
    public void inController() {

    }
}

pointcut用来定义advice被执行的节点,需要注意pointcut定义的方法返回值必须为void.
pointcut使用的语法是aspectj 5 pointcut language
spring支持以下几种pointcut:

pointcut的组合

@Pointcut("execution(public * *(..))")
private void anyPublicOperation() {} 

@Pointcut("within(com.xyz.myapp.trading..*)")
private void inTrading() {} 

@Pointcut("anyPublicOperation() && inTrading()")
private void tradingOperation() {} 

第三个方法表示同时满足1,2两个条件

定义Advice

@Component
@Aspect
public class ControllerLogAspect {

    @Before("inController()")
    public void before(JoinPoint joinPoint){
        log.info(Arrays.toString(joinPoint.getArgs()));
    }

    @Around("inController()")
    public Object controllerAroundLog(ProceedingJoinPoint joinPoint) throws Throwable {
        String className = joinPoint.getTarget().getClass().getName();
        String functionName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        log.info("function:{}===>{},\nargs:{}", className, functionName, args);
        Object proceed = joinPoint.proceed();
        log.info("function:{}===>{},\nresponse:{}", className, functionName, proceed);
        return proceed;
    }
}

所有的advice方法可以使用一个JoinPoint 参数作为方法的第一个参数,这个参数会包含一些被执行方法的信息,@Around类型的advice使用的是ProceedingJoinPoint,继承自JoinPoint .
JoinPoint 的API

示例

@Component
@Aspect
public class ControllerLogAspect {

    @Pointcut("within(com.zww.demo.controller..*)")
    public void inController() {

    }

    @Before("inController()")
    public void before(JoinPoint joinPoint){
        log.info(Arrays.toString(joinPoint.getArgs()));
    }

    @Around("inController()")
    public Object controllerAroundLog(ProceedingJoinPoint joinPoint) throws Throwable {
        String className = joinPoint.getTarget().getClass().getName();
        String functionName = joinPoint.getSignature().getName();
        Object[] args = joinPoint.getArgs();
        log.info("function:{}===>{},\nargs:{}", className, functionName, args);
        Object proceed = joinPoint.proceed();
        log.info("function:{}===>{},\nresponse:{}", className, functionName, proceed);
        return proceed;
    }
}
上一篇下一篇

猜你喜欢

热点阅读