手写spring

1、自定义controller、service、requestParam、autowired、requestMapping注解类

示例:

@Target({ElementType.TYPE}) //指定此注解作用范围,TYPE是类 可以不指定

@Retention(RetentionPolicy.RUNTIME) //元注解 用来指定注解的生命周期,有SOURCE/CLASS/RUNTIME, 必须有

@Documented //javadoc文档化 成为注解元素的公共API的一部分 可以不要

public @interface GPController {

String value() default "";

}

 

2、要想实现一个网页的访问,需要创建servlet(源码见下面),继承HttpServlet, web.xml中添加该servlet的配置。

通过重写HttpServlet的init方法来实现spring的加载。

init里面做的事:

1)加载配置文件:

配置文件中指定要扫描的路径,将配置文件加载到Properties中。

2)获取所有类路径:

获取扫描路径下所有的类,将所有类的全路径放到一个List<String>中

3)ioc组装:

遍历2中的List集合,判断每个元素是否有Controller注解,如果有将对象实例化并放到ioc容器中(实际上就是个Map<String, Object> key是类名的首字母小写,value是类的实例),判断每个元素是否有Service注解,如果用户设置了自己的名字就直接按设置的名字进行放到ioc中,如果没有指定名字就按接口类型进行创建实例并放到ioc中

4)对类中的autowired属性(Field)进行赋值:

遍历ioc容器,然后获取每个容器中对象的具有autowired注解的属性,然后获取这个注解的属性名,如果指定了就取指定的,如果没有指定就取类型的名字作为属性名,根据属性名从ioc容器中取出来然后通过Field.set()进行赋值一下属性的值。

5)关联requestMapper与Method的关系:

遍历ioc容器,判断是不是有Controller注解,有的话获取类的RequestMapping的值作为根路径, 然后获取类中所有的公共方法,判断方法是否有RequestMapping注解,有的话取出值并且拼接根路径,将拼接后的路径作为key,Method对象作为value放到一个Map集合中handlerMapping。

至此初始化完成。

 

3、请求进来的时候需要做个拦截处理,判断请求走哪个方法,所以重写doPost方法。

1)获取请求的url

2)判断url是否在handlerMapping中,没有直接返回404

3)根据url从handlerMapping中获取Method

4)根据Method获取方法的参数类型,并且获取所有请求的参数,然后遍历类型将请求的参数封装到Object[]数组中

5)通过Method获取类名,根据类名从ioc中获取类的实例

6)调用Method的invoke方法,将类和参数传入,执行方法

 

示例源码下载地址:

https://download.youkuaiyun.com/download/sdmanooo/12685597

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值