Springboot学习09:AOP

 基础概念图

 

源码示例

切点

import org.springframework.web.bind.annotation.*;

@RestController
public class AopController {

    @GetMapping("/beforeAop")
    @AopBeforeAnno
    public String beforeAop(){
        System.out.println("beforeAop controller....");
        return "Success";
    }

    @GetMapping("/afterAop")
    @AopAfterAnno
    public String afterAop(){
        System.out.println("afterAop controller....");
        return "Success";
    }
    @PostMapping("/aroundAop/{id}")
    @AopAroundAnno
    public String aroundAop(
            @PathVariable Long id,
            @RequestParam String code,
            @RequestBody AroundAopReq aroundAopReq){
        System.out.println("aroundAop controller....");
        return "Success";
    }
}

 

切面

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

@Component
@Aspect
public class AopHandler {

    //1-前置通知
    //@Pointcut("execution(* com.example.bigdemo.aop.AopController.*(..))")
    @Pointcut("@annotation(com.example.bigdemo.aop.AopBeforeAnno)")
    public Object beforePointCut(){

        return null;
    }


    @Before(value="beforePointCut()")
    public Object before(){
        System.out.println("start aop before task here...");
        return null;
    }

    //后置通知
    @Pointcut("@annotation(com.example.bigdemo.aop.AopAfterAnno)")
    public Object afterPointCut(){
        return null;
    }

    @After("afterPointCut()")
    public Object after(){
        System.out.println("start aop After task here...");
        return null;
    }

    //环绕通知
    @Pointcut("@annotation(com.example.bigdemo.aop.AopAroundAnno)")
    public Object aroundPointCut(){

        return null;
    }

    @Around("aroundPointCut()")
    public Object around( ProceedingJoinPoint proceedingJoinPoint){
        System.out.println("start aop around task here...");
        try {
            System.out.println(Arrays.stream(proceedingJoinPoint.getArgs()));
            Arrays.stream(proceedingJoinPoint.getArgs()).forEach(args->{
                System.out.println(args);
            });

            System.out.println(proceedingJoinPoint.getKind());
            System.out.println(proceedingJoinPoint.getSignature());
            System.out.println(proceedingJoinPoint.getTarget());
            System.out.println(proceedingJoinPoint.getThis());
            proceedingJoinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("end aop around task here...");
        return null;
    }


}

 

自定义注解和POJO

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

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

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


public class AroundAopReq {
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

 

 

 

END

posted on 2020-05-05 17:17  我不吃番茄  阅读(164)  评论(0编辑  收藏  举报