美文网首页
Spring AOP的快速使用

Spring AOP的快速使用

作者: Rogue_bbb1 | 来源:发表于2020-09-02 11:46 被阅读0次

    开启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:

    • execution
    • within
    • this
    • target
    • args
    • @target
    • @args
    • @within
    • @annotation

    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;
        }
    }
    

    相关文章

      网友评论

          本文标题:Spring AOP的快速使用

          本文链接:https://www.haomeiwen.com/subject/nttdrktx.html