自定义注解,反射注解

目的:项目接口的权限设置(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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

 

概念

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

 

posted @ 2020-04-21 18:09  createcoc  阅读(297)  评论(0编辑  收藏  举报