springboot实现自定义注解的方式及简单应用

本文章重在实现自定义注解获取参数的方式,仅仅作为自定义注解的入门,对其他自定义注解的使用不会过多介绍,如有其他使用需求,可继续寻找其他文章。

实现方式

首先创建一个注解类
@Target(ElementType.PARAMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface LoginType {


}

其中 @Target 注解指当前注释能够被应用的元素。具体枚举可自行查询使用
如:ElementType.PARAMETER为可以在方法上使用

示例:

 public Object createOrder(@LoginType String loginType){
        
    }

@Retention注解指 当前注解存在的生命周期
如:RetentionPolicy.RUNTIME‌ 则是指当前注解在项目运行时存在,可以在运行时动态获取注解的值

spring mvc 提供的controller层参数解析
**HandlerMethodArgumentResolver**类 
可以用于获取请求中的参数


 示例:
public class LoginTypeHandlerMethodArgumentResolver implements HandlerMethodArgumentResolver {
    public static final String LOGIN_TYPE_KEY = "ctype";

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
    //此处为注解是否满足需求,如不满足则可能抛出异常
    //isAssignableFrom表示注解所注入的参数值必须为String类型
    //hasParameterAnnotation则表示当前类会对哪个注解进行处理判断
        return parameter.getParameterType().isAssignableFrom(String.class) && parameter.hasParameterAnnotation(LoginType.class);
    }

    @Override
    public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest request, WebDataBinderFactory webDataBinderFactory) throws Exception {
        //此处可用于对参数进行赋值或其他处理
        //1.用户对参数赋值  请求头中规定传值一个LOGIN_TYPE_KEY标识当前请求来源
        //如果为空则赋值为null,方便service层进行后续处理
         String cType = request.getHeader(LOGIN_TYPE_KEY);
        if (cType == null || cType.isEmpty()) {
            return null;
        }
        //2.将当前请求来源加入log日志,方便后续日志处理及查找问题
        MDC.put("source", cType);
        return cType ;
}

HandlerMethodArgumentResolver类拥有多个默认实现,如果获取其他特定参数,可以引用不同的实现。
springboot实现自定义注解的方式及简单应用_第1张图片
具体每个实现可进入源码自行查看或查询相关文档,此处不专门介绍。

跟随以上步骤一个最简单的自定义注解即可使用,在此基础上如果有其他需求或不同的业务逻辑只需要改动部分参数或实现即可完成。

PS:建了一个qq群:324697857欢迎各位进群交流(吹牛打屁)

你可能感兴趣的:(spring,boot,后端,java)