SpringBoot自定义注解与使用

简介

注解是一种能添加到Java代码中的元数据,方法,类,参数与包都可以使用注解进行修饰,可以将注解看为一种特殊的标记,在Java编译或运行过程中将有这种特殊标记的部分进行特殊处理。

自定义注解

注解创建

自定义一个新的注解包括以下基本元素

1、修饰符:注解修饰可以用于
2、关键字:关键字为@interface
3、名称:自定义注解的名称,例如java内置的 Resource
4、注解类型元素:注解中的内容,比如根据需要传递的参数等
5、元注解:主要有@Target、@Retention、@Inherited、@Documented

@Target:用于描述注解的使用范围,该注解可以使用在什么地方

Target类型描述
ElementType.TYPE应用于类、接口(包括注解类型)、枚举
ElementType.FIELD应用于属性(包括枚举中的常量)
ElementType.METHOD应用于方法
ElementType.PARAMETER应用于方法的形参
ElementType.CONSTRUCTOR应用于构造函数
ElementType.LOCAL_VARIABLE应用于局部变量
ElementType.ANNOTATION_TYPE应用于注解类型
ElementType.PACKAGE应用于包

@Retention:表明该注解的生命周期

生命周期类型描述
RetentionPolicy.SOURCE编译时被丢弃,不包含在类文件中
RetentionPolicy.CLASSJVM加载时被丢弃,包含在类文件中,默认值
RetentionPolicy.RUNTIME由JVM 加载,包含在类文件中,在运行时可以被获取到

@Inherited:是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的。如果一个使用了@Inherited修饰的annotation类型被用于一个class,则这个annotation将被用于该class的子类。

@Documented:表明该注解标记的元素可以被Javadoc 或类似的工具文档化

案例

1、自定义认证注解@Authorize

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

    //必填参数
    String[] params() default {};
}

2、创建AOP切面类拦截注解

创建一个aop切面类来拦截注解,实现注解所需要的相关业务逻辑

1、引入aop

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

2、创建aop切面类

@Aspect
@Component
@Slf4j
public class AuthorizeAspect {

    // 引入我们自定义的注解类做切面的拦截点
    @Pointcut("@annotation(com.example.demo.annotation.Authorize)")
    private void pointCut(){}

    // 先执行注解的逻辑
    @Before("pointCut()")
    public void before(JoinPoint joinPoint){
        Object[] objects = joinPoint.getArgs();
        System.out.println("执行了切面");
        User user = JSONObject.parseObject(JSONObject.toJSONString(objects[0]), User.class);
        System.out.println(user);
    }
}

3、调用示例

@RestController
public class HomeController {

    @Resource
    private OrderService orderService;

    // 使用自定义注解进行权限验证
    @GetMapping("/")
    @Authorize
    public String home(User user){
        orderService.createOrder();
        return "success";
    }
}
执行了切面
User(username=jiangjx001, password=123456)
正在进行订单创建
监听到订单创建

原创文章,作者:jiafegn,如若转载,请注明出处:https://www.techlearn.cn/archives/2026

Previous 2024年1月15日
Next 2024年8月21日

相关推荐

  • SpringBoot 缓存 – Redis

    引入依赖 缓存配置 启用缓存 修改项目启动类,增加注解@EnableCaching,开启缓存功能,如下: 配置缓存类 新建Redis缓存配置类RedisConfig,如下: 添加缓…

    2023年4月23日
    161
  • SpringBoot 过滤器

    简介 SpringBoot过滤器在web开发中可以过滤指定的URL,比如拦截掉不需要的接口请求,同时也可以对request和response的内容进行修改。 使用场景 Spring…

    springboot 2023年4月30日
    241
  • Springboot注解-@Component

    作用 作用:@Component的作用是把普通的类实例化到Spring容器中。基于@Component注解有三个扩展,分别是:@Repository、@Service、@Contr…

    springboot 2022年8月3日
    184
  • Springboot 注解大全-@Import

    作用 @Import可以用来批量导入需要注册的各种类,如普通的类、配置类,完成普通类和配置类中所有bean注册到spring容器中。作用范围:作用于类、注解 定义 参数 value…

    springboot 2022年8月15日
    184
  • SpringBoot拦截器

    简介 拦截器可以根据 URL 对请求进行拦截,主要应用于登陆校验、权限验证、乱码解决、性能监控和异常处理等功能。 使用步骤 在SpringBoot中使用拦截器功能通常需要以下3步:…

    springboot 2023年4月29日
    123
  • SpringBoot 单元测试

    简介 Spring Boot 2.2.0 版本开始引入 JUnit 5 作为单元测试默认库,在 Spring Boot 2.2.0 版本之前,spring-boot-starter…

    springboot 2023年4月2日
    242
  • springboot 注解 @ComponentScan

    作用 @ComponentScan用于批量注册bean,这个注解会让spring去扫描某些包及其子包中所有的类,然后将满足一定条件的类作为bean 注册到spring容器中。主要使…

    springboot 2022年11月8日
    219
  • Springboot 注解 @DependsOn

    作用 @DependsOn用来指定当前bean依赖的bean,spring在创建bean的时候,如果bean之间没有依赖关系,那么spring容器很难保证bean实例创建的顺 序,…

    springboot 2022年9月1日
    368
  • SpringBoot 整合Memcached

    简介 Memcached 是一个高性能的分布式内存对象的key-value缓存系统,用于动态Web应用以减轻数据库负载,现在也有很多人将它作为内存式数据库在使用,memcached…

    springboot 2023年4月24日
    242
  • SpringBoot 分布式Session

    简介 现在随着分布式,微服务架构的日益成熟,越来越多的企业将传统的单体服务改造为微服务或是分布式架构,在分布式中就遇到session管理的问题,微服务架构中一个服务为了实现高可用至…

    springboot 2023年4月30日
    176