Spring--Web框架中注解的大致套路

以下内容是以书《架构探险》中的内容为例子

1、类加载(ClassUtil)

  • 根据“包名.类名”的完全限定符,可以唯一确定一个类,用Class.forName()进行动态加载,获得Class对象。注意,这里的Class对象并不是我们想要的那个类的实例对象。
  • Spring中可以设置自动扫描时指定要扫描的包
  • 而我们的实现中,为了简便,没有指定包扫描,而是自己硬编码写了所有Controller类和Service类。所有的类会提供一个共有方法,用一个集合Set返回。

2、根据注解对加载的类进行分类(ClassHelper)

  • 取得ClassUtil中返回的含有全部Class对象的Set,一个个遍历,用反射判断类上是否有Service注解或者Controller注解,或者更多,提供不同的方法(getServiceClassSet、getControllerClassSet),可以返回各自的集合,最后再提供一个getBeanClassSet,返回所有的Bean。

3、为所有的Bean创建实例(BeanHelper)

  • BeanHelper会调用ClassHelper的个getBeanClassSet取得所有的Bean,在一个静态块里遍历,并用反射的方法调用cls.newInstance()创建各自类的实例对象,以cls为Key,实例对象为Value,存储在一个Map中。
  • 并提供getBean()方法,可以传入cls获取对应的实例对象。
  • 这里只会创建一个实例对象,所以所有类的对象都是单例。

4、依赖注入(IocHelper)

  • 用一个静态块,取得BeanHelper中建立的Map对象,遍历,取出map中的每一个Class类以及相应的实例对象,遍历Class类的Field数组,检查每一个Field上是否有Autowired注解,如果有,再用field.getType()取得这个被注解变量的类型,用map.get()查看其是否是由bean容器管理的对象,即:是否在map中有实例对象,如果是,get返回不为null,此时,map.get()取出的对象,就是被注解的变量field所需要的对象,通过field.set()完成依赖注入。

5、实现@RequestMapping注解(ControllerHelper)

  • 首先要另外定义两个类:Request(String requestMethod, String requestPath)和Handler(Class<?> controllerClass, Method actionMethod)。
  • 从构造函数可以看出,Request类是请求方法和请求URL的包装类Handler是Controller类和添加的@RequestMapping注解方法的包装类。两者之间需要建立一个映射关系,放入一个Request Map中。并提供一个可根据Request对象获取处理方法的方法。
  • 实现如下:首先遍历带Controller注解的Class类,遍历类上的Methods,判断哪些带有@RequestMapping注解,用method.getAnnotation(MyRequestMapping.class)取得注解对象,再取得注解上的value,这是一个URL,构造Request对象,再根据当前的controllerClass和method,构造Handler对象,以Request对象为Key,Handler对象为value,添加到Request Map 中去保存。

6、用一个HelperLoader类来统一进行框架类的加载

7、实现DispatcherServlet

  • 首先在init()里调用HelperLoader进行初始化加载。
  • 然后,在Servlet的类上用@WebServlet注解“/”拦截所有请求,从HttpServletRequest对象中获取请求方法与请求路径,通过ControllerHelper.getHandler来构造Request对象,从而从Map里获取Handler对象。
  • Handler对象里面有能处理这个URL的Controller类的Class和对应的Method对象。
  • 通过cls = handler.getControllerClass()可以获取Controller的Class对象
  • 通过BeanHelper.getBean(cls)可以获取这个Controller类的实例对象,
  • 通过handler.getActionMethod()可以获取对象上与URL对应的方法,用上一步取得的具体实例对象可以调用这个方法,执行被注解的方法中的代码。
  • 取得被注解方法的返回值,写入response对象,结束。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 220,137评论 6 511
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,824评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,465评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,131评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,140评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,895评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,535评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,435评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,952评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,081评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,210评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,896评论 5 347
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,552评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,089评论 0 23
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,198评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,531评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,209评论 2 357

推荐阅读更多精彩内容