个人水平比较菜,没有这么高的实力简单实现springmvc框架,我是看了一个老哥的博客,这老哥才是大神!
原文链接:https://www.cnblogs.com/xdp-gacl/p/4101727.html
ok,开始瞎扯一下,我们用springmvc的时候是不是要导入依赖或者是jar包啊,那是由于别人将很多功能都给设计好了,我们直接拿过来用,这有好处也有坏处;好处是用起来很方便,直接用就好了,但是坏处就是封装的太好了我们很难真正的弄清楚其中的运行原理,虽然说可以走源码,但是总是感觉差了一点什么东西。
反正我走源码就是总感觉有点欠缺,但是又说不上来哪里不对劲,直到现在醒悟了一点,其实就是对原理了解的不够彻底,还有就是源码都是一层套一层,层层封装,走着走着我也不知道上一步做了什么事了,简直就是山路十八弯,哈哈哈。
瞎扯结束,接下来我根据那个老哥的博客自己稍微整理一下,简单实现一个springmvc的框架,只为更透彻的了解springmvc的原理!
在看本篇博客之前,可以先忘记以前springmvc的所有东西,我们以 servlet+自定义注解 实现
新建一个普通的java web项目,我的目录结构如下:
1.工具类
自己简单实现一些什么框架,必不可少的就是要提前准备很多的工具类
首先就是要把下面这七个工具类准备好,我把代码复制过来;
1.1 BeanUtils:对反射的一些操作,可以根据传入xxx.Class参数,进行实例化或者找到其中某个方法
package com.wyq.utils; import java.lang.reflect.Constructor; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.lang.reflect.Modifier; /** * 对java反射的一些封装 */ public class BeanUtils { /** * 实例化一个class */ public static <T> T instanceClass(Class<T> clazz){ if(!clazz.isInterface()){ try { return clazz.newInstance(); } catch (InstantiationException e) { e.printStackTrace(); } catch (IllegalAccessException e) { e.printStackTrace(); } } return null; } /** * 通过构造函数实例化 * */ public static <T> T instanceClass(Constructor<T> ctor, Object... args) throws IllegalArgumentException, InstantiationException, IllegalAccessException, InvocationTargetException{ makeAccessible(ctor); return ctor.newInstance(args);//调用构造方法实例化 } /** * 查找某个class的方法 * */ public static Method findMethod(Class<?> clazz, String methodName, Class<?>... paramTypes){ try { return clazz.getMethod(methodName, paramTypes); } catch (NoSuchMethodException e) { return findDeclaredMethod(clazz, methodName, paramTypes);//返回共有的方法 } } public static Method findDeclaredMethod(Class<?> clazz, String methodName, Class<?>[] paramTypes){ try { return clazz.getDeclaredMethod(methodName, paramTypes); } catch (NoSuchMethodException ex) { if (clazz.getSuperclass() != null) { return findDeclaredMethod(clazz.getSuperclass(), methodName, paramTypes); } return null; } } public static Method [] findDeclaredMethods(Class<?> clazz){ return clazz.getDeclaredMethods(); } public static void makeAccessible(Constructor<?> ctor) { if ((!Modifier.isPublic(ctor.getModifiers()) || !Modifier.isPublic(ctor.getDeclaringClass().getModifiers())) && !ctor.isAccessible()) { ctor.setAccessible(true);//如果是私有的 设置为true 使其可以访问 } } public static Field[] findDeclaredFields(Class<?> clazz){ return clazz.getDeclaredFields(); } }