本文共 1320 字,大约阅读时间需要 4 分钟。
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方法,将类和参数传入,执行方法
示例源码下载地址:
转载地址:http://cqcdi.baihongyu.com/