一.读取配置
二.注解定义
定义了Controller,Service,RequestMapping,AutoWired,其中Controller,Service作用于class上:
@Target(ElementType.TYPE) @Retention(RetentionPolicy.RUNTIME)
RequestMapping用于匹配请求路径
@Target(ElementType.METHOD) @Retention(RetentionPolicy.RUNTIME)
作用于方法
AutoWired用于bean的注入
@Target(ElementType.FIELD) @Retention(RetentionPolicy.RUNTIME)
三.class管理
static { CLASS_SET = ClassUtils.getClassSet(ConfigHelper.getAppBasePackage()); }
在静态代码块里面,扫描基础包,获取所有的class
四.bean的管理
获取所有beanClass
CLASS_SET.stream().filter(clazz -> clazz.isAnnotationPresent(Service.class) || clazz.isAnnotationPresent(Controller.class)
将bean实例化
Object obj = bean.newInstance();
并且以map形式存储起来
BEAN_MAP.put(bean,obj);
五.controllerHelper的实现
因为http请求过来后,首先要找到对应的controller,所以controller需要一些特殊的处理。
REQUEST_MAP
是一个map结构,用来管理加了@RequestMapping的方法,其中requestmapping的key包含了method和path来匹配标示其对应的http请求,
private MethodEnum method; private String path;
而value值是对该http请求的处理
Class<?> controllerClass; Method method;
包含了改controller的class和对应的method。
五.ioc实现
在BeanMap中循环遍历,找到@AutoWired的Field,从BeanMap中找到对应的实例,将Field实例化,至此控制反转完成。
六.servlet的实现
继承自HttpServlet,urlPattern劫持所有的http请求。重写init方法,load以上的helper,让静态块内的代码执行(其实不提前load也完全可以,当该class被使用时,也会执行其静态块)。
在service的重载中,最重要的便是找到对应的controller的方法,当然,我们能拿到req的方法和path,从request_map中找到对应的method很容易。然后便是处理request中带来的参数,以及body,把它交由method去处理。(现在还是很菜鸡的,对于path上的参数还不能处理。)最后,根据method的返回结果(json或者页面资源)加载resp中,返回给前端。