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
    评论
好的,关于SpringBoot定义注解AOP的问题,我可以为您提供一些基本的介绍和示例代码。 首先,AOP(Aspect-Oriented Programming)是一种编程范式,它可以在不修改业务逻辑代码的情况下,对应用程序进行横切关注点的切面处理。而Spring AOP作为Spring框架的一部分,提供了一种基于代理模式的AOP实现。 在使用Spring AOP的过程中,自定义注解可以作为切点表达式的一部分,通过对注解的解析,实现对被注解的方法或类的切面处理。下面是一个简单的示例代码,演示如何通过自定义注解实现对方法的AOP处理: 首先,定义一个自定义注解: ```java @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface MyAnnotation { String value() default ""; } ``` 然后,在需要被拦截的方法上添加该注解: ```java @Service public class MyService { @MyAnnotation("myAnnotation") public void doSomething() { System.out.println("do something..."); } } ``` 接下来,使用AspectJ的@Aspect注解定义一个切面类,并在该类中定义一个切点,用于匹配被@MyAnnotation注解的方法: ```java @Aspect @Component public class MyAspect { @Pointcut("@annotation(com.example.demo.annotation.MyAnnotation)") public void myAnnotationPointcut() {} @Before("myAnnotationPointcut()") public void beforeMyAnnotation() { System.out.println("before myAnnotation..."); } } ``` 最后,启动SpringBoot应用程序,调用MyService的doSomething方法,就可以看到输出结果: ```java before myAnnotation... do something... ``` 以上就是一个简单的SpringBoot定义注解AOP的示例。通过使用自定义注解,可以更加方便地实现对应用程序的切面处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值