SpringBoot项目中使用自定义注解实现aop环绕切面

1:新建一个自定义注解:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnno {
}

其中 @Target(ElementType.METHOD) 决定了这个注解能作用于哪里,ElementType.METHOD表示作用在方法上

2:新建一个切面

import lombok.SneakyThrows;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;

public class MyAnnoAspectJ {

    @Pointcut("@annotation(MyAnno)")
    public void pointcut() {
    }

    @Around(value="pointcut()")
    @SneakyThrows
    public Object around(ProceedingJoinPoint point){
        System.out.println("环绕前");
        Object proceed = point.proceed();
        System.out.println("环绕后");
        return proceed;
    }
}

3:添加测试service

import com.gdunicom.cloud.services.mainservice.controller.test.MyAnno;
import org.springframework.stereotype.Service;

/**
 * @author wzh
 * @date 2023/6/1
 * @apiNote
 */
@Service
public class TestService {

    @MyAnno
    public void testMethod() {
        System.out.println("执行方法");
    }
}

注意!!!

被aop增强的方法,不可用使用this来引用!!否则aop会失效。比如:此处使用this.testMethod(),并不会执行@MyAnno的环绕方法,具体原因如下:

Spring会在一个bean创建的时候判断是否要进行代理,当需要使用到AOP时,会把创建的原始的Bean对象wrap成代理对象作为Bean返回。所以,只有被动态代理出来的对象,才可以被Spring增强,具备AOP的能力。而this指向的是一个普通的对象,而不是被Spring增强后的bean。

4:测试

创建一个TestController,用swagger调用

@Slf4j
@RestController
@RequestMapping("/test")
@Api(tags = "test")
public class TestController {

    @Autowired
    TestService testService;

    @GetMapping("/test")
    @ApiOperation(value = "test", notes = "test")
    public R test(){
        testService.testMethod();
        return R.data("");
    }

}

执行后:

SpringBoot项目中使用自定义注解实现aop环绕切面_第1张图片

环绕方法执行成功。

你可能感兴趣的:(spring,boot,spring,java)