自定义注解,反射注解
目的:项目接口的权限设置(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
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
概念
元注解(为其他注解做注解)