自定义annotation注解并对其做切面

14 篇文章 1 订阅

编写一个注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@RequestMapping(method = RequestMethod.GET)
public @interface RequestGet {

    /**
     * Alias for {@link RequestMapping#name}.
     */
    @AliasFor(annotation = RequestMapping.class)
    String name() default "";

    /**
     * Alias for {@link RequestMapping#value}.
     */
    @AliasFor(annotation = RequestMapping.class)
    String[] value() default {};

    /**
     * Alias for {@link RequestMapping#path}.
     */
    @AliasFor(annotation = RequestMapping.class)
    String[] path() default {};

    /**
     * Alias for {@link RequestMapping#params}.
     */
    @AliasFor(annotation = RequestMapping.class)
    String[] params() default {};

    /**
     * Alias for {@link RequestMapping#headers}.
     */
    @AliasFor(annotation = RequestMapping.class)
    String[] headers() default {};

    /**
     * Alias for {@link RequestMapping#consumes}.
     */
    @AliasFor(annotation = RequestMapping.class)
    String[] consumes() default {};

    /**
     * Alias for {@link RequestMapping#produces}.
     */
    @AliasFor(annotation = RequestMapping.class)
    String[] produces() default {};

}

这个注解的功能和GetMapping注解是一样的。

编写一个测试controller

@RestController
public class TestController {

    @RequestGet("/hello")
    public String hello(String name){
        return "hello" + name;
    }

}

编写对这个注解的增加类

@Component
@Aspect
public class RequestGetAspect {

    private static final Logger logger = LoggerFactory.getLogger(RequestGetAspect.class);


    /**
     * 对这个注解做切面
     */
    @Pointcut("@annotation(com.wk.annation.demo.annation.RequestGet)")
    public void pointCut(){

    }

    @Around("pointCut()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        logger.info("方法开始执行");
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            logger.info("方法参数:" + arg);
        }
        logger.info("方法结束执行");
        return joinPoint.proceed();
    }

}

查看日志

在这里插入图片描述
在这里插入图片描述

这样我们可以通过自定义注解实现对这个接口的参数校验,或者限流等操作。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用自定义注解定义切面,你可以结合使用AspectJ和自定义注解。以下是一个示例代码: 1. 首先,定义一个自定义注解,用于标记需要应用切面的方法: ```java import java.lang.annotation.*; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.METHOD) public @interface LogExecutionTime { } ``` 2. 创建一个切面类,使用AspectJ注解来定义切面逻辑: ```java import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.*; import org.springframework.stereotype.Component; @Aspect @Component public class LoggingAspect { @Around("@annotation(LogExecutionTime)") public Object logExecutionTime(ProceedingJoinPoint joinPoint) throws Throwable { long startTime = System.currentTimeMillis(); Object result = joinPoint.proceed(); long endTime = System.currentTimeMillis(); long executionTime = endTime - startTime; System.out.println(joinPoint.getSignature() + " executed in " + executionTime + "ms"); return result; } } ``` 在上面的示例中,我们使用`@Around`注解来定义一个环绕通知,它会在带有`@LogExecutionTime`注解的方法执行前后进行处理。在环绕通知中,我们记录了方法的执行时间,并打印出来。 3. 在需要应用切面的方法上添加`@LogExecutionTime`注解: ```java @Service public class MyService { @LogExecutionTime public void myMethod() { // 方法实现 } } ``` 在上面的示例中,我们在`myMethod`方法上添加了`@LogExecutionTime`注解。 4. 配置AspectJ和扫描切面: 如果使用Spring框架,你需要在配置文件中启用AspectJ自动代理,并扫描切面类。 XML配置: ```xml <aop:aspectj-autoproxy/> <context:component-scan base-package="com.your.package"/> ``` Java配置: ```java @Configuration @EnableAspectJAutoProxy @ComponentScan(basePackages = "com.your.package") public class AppConfig { // 配置其他Bean } ``` 使用上述示例代码,你可以定义自己的切面,通过自定义注解来标记需要应用切面的方法,并在切面中定义相应的逻辑。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值