Java 注解Annotation总结二

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Weixiaohuai/article/details/85092182

一、简介

上篇文章主要介绍了注解的概念以及怎么自定义一些注解,本文将通过SpringBoot中实现获取当前登录用户的自定义注解示例,进一步熟悉自定义注解的实际应用场景。

二、实现思路

【a】定义用户实体类User:

public class User implements Serializable {

    private String loginId;
    private String name;

    public User(String loginId, String name) {
        this.loginId = loginId;
        this.name = name;
    }

    public String getLoginId() {
        return loginId;
    }

    public void setLoginId(String loginId) {
        this.loginId = loginId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

【b】自定义注解CurrentLoginUser:

/**
 * @Description: 当前登录用户自定义注解
 * @Auther: weishihuai
 * @Date: 2018/12/19 10:32
 * 说明: 在web端controller接口中,可以通过注入该注解,获取到当前登录的用户信息
 */

@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CurrentLoginUser {
    String value() default "";
}

【c】自定义参数解析器:

/**
 * @Description: @CurrentLoginUser注解解析器
 * @Auther: weishihuai
 * @Date: 2018/12/19 10:36
 * 说明: 自定义参数解析器
 */
public class CurrentLoginUserMethodArgumentResolver implements HandlerMethodArgumentResolver {

    public CurrentLoginUserMethodArgumentResolver() {
    }

    /**
     * 用于判定是否需要处理该参数分解,返回true为需要,并会去调用下面的方法resolveArgument.
     *
     * @param methodParameter 方法参数
     * @return
     */
    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        //如果方法参数上面有@CurrentLoginUser注解,返回true,并且执行下面的resolveArgument()解析参数的方法,如果不存在该注解返回false,不会执行resolveArgument()方法
        return methodParameter.hasParameterAnnotation(CurrentLoginUser.class);
    }

    /**
     * 真正用于处理参数分解的方法,返回的Object就是controller方法上的形参对象.
     *
     * @param methodParameter       方法参数
     * @param modelAndViewContainer
     * @param nativeWebRequest
     * @param webDataBinderFactory
     * @return 自定义注解参数的值
     * @throws Exception
     */
    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
//        获取当前登录的用户信息(可以同时返回登录用户所有的权限或者角色信息)
//        Object principal = SecurityUtils.getSubject().getPrincipal();
//        if (null != principal  && principal instanceof RbacUserInfoProtocol){
//            return principal;
//        }

        //获取当前登录用户的逻辑处理
        //这里只是模拟简单的返回当前登录用户
        return new User("admin", "zhangsan");
    }
}

【d】 配置自定义参数解析器

/**
 * @Description: 配置自定义参数解析器
 * @Auther: weishihuai
 * @Date: 2018/12/19 10:52
 */
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {

    @Bean
    public CurrentLoginUserMethodArgumentResolver currentLoginUserMethodArgumentResolver() {
        return new CurrentLoginUserMethodArgumentResolver();
    }

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        //添加@CurrentLoginUser方法注解的解析处理
        argumentResolvers.add(currentLoginUserMethodArgumentResolver());
        super.addArgumentResolvers(argumentResolvers);
    }
}

【e】测试

@RequestMapping("/testLoginUser")
    public void testLoginUser(@CurrentLoginUser User user) {
        System.out.println("TestController.testLoginUser-->loginId-->" + user.getLoginId() + "-->name-->" + user.getName());
    }

启动项目:

如图,可以看到,当前登录用户的值都注入到@CurrentLoginUser注解中了,可以在Controller中注解拿出当前登录用户的信息,避免频繁调用获取当前用户信息的方法,比较简便。

三、总结

以上就是关于在SpringBoot中使用自定义注解获取当前登录用户的示例,仅供大家学习参考,希望对大家的学习有所帮助。

猜你喜欢

转载自blog.csdn.net/Weixiaohuai/article/details/85092182
今日推荐