Spring boot 自定义注解 简单版本解析参数

本文介绍如何在 SpringBoot 中实现自定义注解来统一处理获取 userid 的过程。通过定义注解 `@InternalSubject` 和创建解析器 `InternalSubjectResolver` 实现参数解析,并利用 `UserIdHolder` 类进行值的存储与读取。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

背景:

其实就是想用一个注解,来统一处理获取userid的解析过程。 嗯,但是我觉得自己对注解也没有那么了解,所以再记录下。


spring boot 中自定义注解的方案:

STEP1. 定义注解

STEP2. 注解解析


1. 定义注解

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface InternalSubject {
}

看起来很简单哈哈

简单说明下 

@Target说明了Annotation所修饰的对象范围。 就是这个注解可以用在什么地方。ElementType)有:

  • CONSTRUCTOR:用于描述构造器
  • FIELD:用于描述域
  • LOCAL_VARIABLE:用于描述局部变量
  • METHOD:用于描述方法
  • PACKAGE:用于描述包
  • PARAMETER:用于描述参数
  • TYPE:用于描述类、接口(包括注解类型) 或enum声明

@Retention定义了该Annotation被保留的时间长短。用于描述注解的生命周期(即:被描述的注解在什么范围内有效)取值(RetentionPoicy)有:

    1.SOURCE:在源文件中有效(即源文件保留)
    2.CLASS:在class文件中有效(即class保留)
    3.RUNTIME:在运行时有效(即运行时保留

其余还有两个元注解:--我没用 所以就先不写啦

@Documented用于描述其它类型的annotation应该被作为被标注的程序成员的公共API

@Inherited 元注解是一个标记注解,@Inherited阐述了某个被标注的类型是被继承的


2. 注解解析

这里主要是要解析userid,一个参数。所以其实是通过

import org.springframework.core.MethodParameter;
import org.springframework.web.bind.support.WebDataBinderFactory;
import org.springframework.web.context.request.NativeWebRequest;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.method.support.ModelAndViewContainer;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor // 这个如果需要初始化的参数可以不用
public class InternalSubjectResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return methodParameter.hasParameterAnnotation(InternalSubject.class); // 检查需要解析的参数条件,这里是被使用了该注解的参数
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter,
                                  ModelAndViewContainer modelAndViewContainer,
                                  NativeWebRequest nativeWebRequest,
                                  WebDataBinderFactory webDataBinderFactory) throws Exception {
        return UserIdHolder.getUserId(); // 核心在这里 返回要解析的参数的的返回值
    }
}

对于参数的解析,其实是在一个地方赋值过了。 

所以其实

public class UserIdHolder {
    private static ThreadLocal<String> tokenThreadLocal = new ThreadLocal<>(); // 通过这个记录

    public static String getAuthorizedUserId() {
        return tokenThreadLocal.get();
    }

    public static void setAuthorizedUserIdn(String userId) {
        tokenThreadLocal.set(userId); // 可以在filter 或则interceptor中进行set  !! 这是关联性 
    }

    public static void removeAuthorizedUserId() {
        tokenThreadLocal.remove();
    }

}


备注下 maven

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-web</artifactId>
    <optional>true</optional>
</dependency>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值