扫描包下所有的controller(二)

作者: z七夜 | 来源:发表于2018-06-12 19:06 被阅读6次

    写在前面

    准备手写一个简易版的springmvc,大伙别笑,瞎弄,往下看看,指点一下
    1.自定义注解
    1.扫描包
    2.得到包中所有的.class文件,使用map存储文件的全类名和Class实例
    请看这篇https://www.jianshu.com/p/e00c00b52e16
    3.判断类是否有Controller注解,和RequestMapping注解,
    4.如果有,用map存储,类的全类名和类对象,存储下映射路径
    5.判断是否有RequestMapping注解
    6.如果有,用map存储,映射路径和method实例
    7.根据路径,反射调用类中的方法
    https://www.jianshu.com/p/0df260de4b13

    前面我们已经写了,如何得到包下所有的类文件呢,https://www.jianshu.com/p/e00c00b52e16,现在我们要判断该类是否有Controller注解

    1.自定义注解

    定义Controller注解

    @Target({ElementType.TYPE})
    @Retention(RetentionPolicy.RUNTIME)
    public @interface Controller {
    }
    

    使用@interface声明注解,
    @Target是元注解,即是注解在注解上的,用于声明该注解可以在哪个位置
    ElementType.TYPE, 修饰类,接口枚举,注解
    ElementType.FIELD, 修饰描述域
    ElementType.METHOD 修饰方法

    @Retention也是元注解,用于声明该注解在什么时候可见,
    RetentionPolicy.RUNTIME 运行时可见,反射的基础
    RetentionPolicy.CLASS 在字节码可见
    RetentionPolicy.SOURCE 只在源文件存在

    定义RequestMapping注解

    2.判断是否是Controller

    3.2

    判断类上是否有Controller注解,判断方法上是否有RequestMapping注解,得到方法的映射路径


    image.png

    成功得到Controller,和前面一篇得到包中所有的类结合

    3.综合版

    public static HashMap<String,Object> controllerMap = new HashMap<String,Object>();
        public static HashMap<String,Method> methodMap = new HashMap<String,Method>();
    
    
        public static void initServer(String packageName){
    
            //存放类路径与类对象
            HashMap<String, Class<?>> ClassHashMap = ScannerUtils.scannerPackage(packageName);
    
            Iterator<String> iterator = ClassHashMap.keySet().iterator();
            while (iterator.hasNext()){
                //遍历map, 根据key得到类的实例对象
                String className = iterator.next();
                Class aClass = ClassHashMap.get(className);
    
                //如果是controller
                if (aClass.isAnnotationPresent(Controller.class)){
    
                    System.out.println(aClass.getName()+"被标记为控制器...");
                    //一个方法的全映射路径
                    String path="";
                    //如果有RequestMapping注解
                    if (aClass.isAnnotationPresent(RequestMapping.class)){
                        //RequestMapping annotation = (RequestMapping) aClass.getAnnotation(RequestMapping.class);
                        String s = ((RequestMapping) aClass.getAnnotation(RequestMapping.class)).value()[0];
                        path=SpliteUtils.spliteUrl(s);
                    }
    
                    //将该controller对象实例存入map,key是controller中的RequestMapping
                    try {
    
                        controllerMap.put(className,aClass.newInstance());
    
                    } catch (InstantiationException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
    
                    //得到类中的所有方法
                    Method[] methods = aClass.getMethods();
    
                    for (Method method: methods){
                        if (method.isAnnotationPresent(RequestMapping.class)){
                            //如果方法有映射
                            String s = method.getAnnotation(RequestMapping.class).value()[0];
                            String methodPath = path+ SpliteUtils.spliteUrl(s);
                            System.out.println("映射路径:"+methodPath);
                            methodMap.put(methodPath,method);
                        }
                    }
    
                }
    
            }
    
    
        }
    

    1.先调用扫描包,得到包中所有的类文件
    2.遍历类文件,判断是否是controller,如果是,使用hashmap添加该controller的全类名和实例对象,判断类上是否有RequestMapping注解,得到映射路径
    3.判断类中的方法是否有RequestMapping注解,得到映射路径,添加映射路径和方法到hashmap

    这样就得到了所有的controller和方法的映射路径,

    QQ群:552113611

    相关文章

      网友评论

        本文标题:扫描包下所有的controller(二)

        本文链接:https://www.haomeiwen.com/subject/tcyreftx.html