扫描包下所有的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