• 自定义注解,反射注解


    目的:项目接口的权限设置(springBoot)

    在Controller的类上和方法上打注解(项目运行时,使用反射获取注解的值),然后将方法的访问权限放入数据库表,用户发起请求时,在拦截器里面查询数据库验证是否有权限

    代码

    定义两个注解

    /**
     * 定义一个用于类上的注解,并且可以使用反射获取
     */
    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ClassAnnotation {
        //类名称,或类描述
        String className();
    }
    /**
     * 定义一个用于方法上的注解,并且可以使用反射获取
     */
    @Target({ElementType.METHOD})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface MethodAnnotation {
        //方法名称,或方法描述
        String methodName() default "";
        //是否有权限0:有限制的访问权限,1:登录即可访问
        int type() default 0;
    }

    在Controller上使用注解

    @ClassAnnotation(className="控制器类")
    public class TestController {
        @MethodAnnotation(methodName = "方法描述:登录就能访问",type = 1)
        public void test001(){
            
        }
        @MethodAnnotation(methodName = "方法描述:有限制的访问权限",type = 0)
        public void test002(){
    
        }
    }

    main方法中测试(这里的for里面会空指针异常,是因为,一个类还有Object类的一些方法,这些方法没有注解所以抛异常,自己处理)

    public static void main(String[] args) {
            //获取控制器类的Class对象
            Class<TestController> c = TestController.class;
            //获取控制器类上的注解
            ClassAnnotation annotation = c.getAnnotation(ClassAnnotation.class);
            System.out.println("类的描述为:" + annotation.className());
            //获取控制器类的所有方法
            Method[] methods = c.getMethods();
            for (Method m : methods) {
                //获取某个方法上的注解
                MethodAnnotation methodAnnotation = m.getAnnotation(MethodAnnotation.class);
                System.out.println("方法..."+m.getName()+"::"+methodAnnotation.methodName()+methodAnnotation.type());
            }
        }

     在项目中使用

    /**
    * 权限构造器,项目启动的时候加载
    */
    @Component
    public class SpringControllerPermissionBuilder implements ApplicationContextAware {
    
        @Override
        public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
         // RequestMappingHandlerMapping requestMappingHandlerMapping
    = applicationContext.getBean(RequestMappingHandlerMapping.class); // 获取url与类和方法的对应信息 Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping.getHandlerMethods();for (Map.Entry<RequestMappingInfo, HandlerMethod> m : map.entrySet()) { HandlerMethod method = m.getValue(); RequestMappingInfo info = m.getKey();
           //获取类上注解 ClassAnnotation permissionGroup
    = method.getMethod().getDeclaringClass().getAnnotation(ClassAnotation.class);
           //获取方法上的注解 MethodAnnotation permissionItem
    = method.getMethod().getAnnotation(MethodAnnotation.class);
           //获取类的所有方法的访问路径(即接口访问路径)
           Set<String> stringSet = info.getPatternsCondition().getPatterns();
          //写入数据库.....
    }
    从ApplicationContextAware获取ApplicationContext上下文的情况,仅仅适用于当前运行的代码和已启动的Spring代码处于同一个Spring上下文,否则获取到的ApplicationContext是空的。


    作者:不知名的蛋挞
    链接:https://www.jianshu.com/p/4c0723615a52
    来源:简书
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    概念

    元注解(为其他注解做注解)

  • 相关阅读:
    awk
    django教材
    saltstack的安装过程
    OPENSTACK学习笔记(1)
    5G核心网架构
    内存采集
    分析CPU文件
    环境管理系统
    属性的两种定义方式
    Python 面向对象(初级篇)
  • 原文地址:https://www.cnblogs.com/javalbb/p/12746452.html
Copyright © 2020-2023  润新知