SpringBoot开发(6)——使用aop

  1. 在pom.xml中添加依赖
    <!--aop依赖-->
    <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
  2. 自定义注解,后面直接通过在方法上加注解即可,在cxsbg包下新建aop包,在aop包中添加InvokeLog注解
    package com.cxsbg.aop;
    
    import java.lang.annotation.ElementType;
    import java.lang.annotation.Retention;
    import java.lang.annotation.RetentionPolicy;
    import java.lang.annotation.Target;
    
    @Target(ElementType.METHOD) //注解用到的地方,比如注解用在方法上
    @Retention(RetentionPolicy.RUNTIME) //注解在什么时候,比如runntime
    public @interface InvokeLog {
    }
    
  3. 定义切面类,首先要定义切点,承载刚定义的注解,然后定义增前方法
    package com.cxsbg.aop;
    
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.Signature;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Pointcut;
    import org.aspectj.lang.reflect.MethodSignature;
    import org.springframework.stereotype.Component;
    
    @Aspect //标识这是一个切面类
    @Component
    public class InvokeLogAspect {
        //确定切点,承载注解,即哪些注解用到这个切面类
        @Pointcut("@annotation(com.cxsbg.aop.InvokeLog)")
        public void pt(){}
    
        //通知方法
        @Around("pt()") //加了InvokeLog注解的方法都会调用该方法
        //参数joinPoint表示正在运行中的被增强的方法
        public Object printInvokeLog(ProceedingJoinPoint joinPoint) {
            //目标方法调用前
            System.out.println();
            MethodSignature signature = (MethodSignature) joinPoint.getSignature();
            String methodName = signature.getMethod().getName();
            System.out.println(methodName + "即将被调用");
    
            Object proceed = null;
            try {
                proceed = joinPoint.proceed();
                //目标方法调用后
                System.out.println(methodName + "调用结束");
            } catch (Throwable e) {
                e.printStackTrace();
                //目标方法调用出现异常
                System.out.println(methodName + "出现异常");
            }
    
            return proceed;
        }
    }
    
  4. 在方法上加上该注解
    @Override
    @InvokeLog //需要被增强的方法加上对应的注解
    public List<User> findAll() {
        return userMapper.findAll();
    }

发表评论

邮箱地址不会被公开。 必填项已用*标注