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

 

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值