springboot自定義註解實現AOP編程

前言:實現AOP切面編程,第一種是以@before,@After,@Around系統註解實現,另外一種是自定義註解實現AOP,自定義註解更加靈活

1.引入aop依賴

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-aop</artifactId>
        </dependency>

2.編寫測試controller

@RestController
@RequestMapping("aop/")
public class AopController {
    @Autowired
    private AopService aopService;
    @GetMapping("testAop")
    public String  testAop(){
        return aopService.testAop("測試AOP");
    }
    @GetMapping("selectYear")
    public String  selectYear(String message){
        return aopService.selectYear(message);
    }
}

3.定義切面類(系統註解實現)

/*
    * 定義切入點指定方法selectYear,String爲參數類型,message爲參數值
    * public * com.boot.bjiang.aop.controller.AopController.* (..))這種指定方式類裏面的所 
    * 有方法都攔截
    * */
    /*
    * before註解實現的是在方法之前執行
    * */
    @Before("execution(public * com.boot.bjiang.aop.controller.AopController.selectYear (String))&&args(message))")
    public void beforeAspect(String message){
        log.info(message);
    }
    /*
     * After註解實現的是在方法之後執行
     * */
    @After("execution(public * com.boot.bjiang.aop.controller.AopController.selectYear (String))&&args(message))")
    public void AfterAspect(String message){
        log.info("return message={}",message);
    }

    /**
     * 執行返回通知
     * */
    @AfterReturning(value = "execution(public * com.boot.bjiang.aop.controller.AopController.selectYear (String))&&args(message))",returning ="response")
    public void AfterReturning(String message,String response){
        log.info("入參={},返回={}",message,response);
    }
    /**
     * @description  使用環繞通知,優勢在於不需要before和After,一個註解實現兩種功能
     */
    @Around("execution(public * com.boot.bjiang.aop.controller.AopController.selectYear (String))&&args(message))")
    public void doAroundGameData(ProceedingJoinPoint pjp, String message) throws Throwable {
        try{
            log.info("方法開始執行messege={}",message);
            pjp.proceed();
            log.info("方法執行結束messege={}",message);
        }
        catch(Exception e){
            log.error(e.getMessage(),e);
        }
    }

4.自定義註解實現aop,更加靈活實現切面編程。將自定義的註解添加到需要實現AOP的方法上面,更加靈活

A .編寫註解
   /**
    * 自定義註解實現AOP
    * */
   
   @Documented
   @Retention(RetentionPolicy.RUNTIME)
   @Target(ElementType.METHOD)
   public @interface LogAspect {
       String value() default "自定義註解攔截";
   }
   B.將註解添加到需要攔截的方法上
       @GetMapping("selectYear")
       @LogAspect
       public String  selectYear(String message){
           return aopService.selectYear(message);
       }
    C.定義切面方法
    /**
         * 自定義註解攔截
         * */
        @Around("@annotation(com.boot.bjiang.aop.aspect.LogAspect)")
        public void doAroundGameData(ProceedingJoinPoint pjp) throws Throwable {
            try{
                Object[] message=pjp.getArgs();
                log.info("方法開始執行messege={}", JSON.toJSONString(message));
                pjp.proceed();
                log.info("方法執行結束messege={}",JSON.toJSONString(message));
            }
            catch(Exception e){
                log.error(e.getMessage(),e);
            }
        }
    

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章