从这一章开始我将逐步研发一个MVC框架并内嵌在​我的开源项目中。由于内容会很多,所以我尽量拆分成多个章节来介绍,以展示框架研发的过程和一些​细节。

上面上传的代码是整套MVC框架设计的起点,这些都是我们在spring中常见的注解类,声明好这些类后,在实际开发过程中我们就可以利用这些注解来生生成单例实例并交由spring管理了,在研发的这套框架中在能完成正常的业务开发需求之上,还简化了了很多繁琐的设计,然后还给自己的这一套注解类起了一个响亮的别名:My*系列。

一般的我们都是按照这样的结构设计​项目的包目录的:

只要有统一的父节点,包目录分散的都不要紧,无非就是在扫描包的时候消耗一点性能,多扫一些无用的类罢了​。设计好包目录结构后,再来配置一下扫描规则,​如下图所示:

四个类型的包扫描配置,用数组的形式配置,支持你分散设计包的目录结构,没有任何限制,配置也很简单。

下面我就按照我对spring的理解来分析一下整个spring项目的网状交叉依赖关系是怎么启动和注入完成的​。因为我的分析是直接给出的结论并没有叙述思考问题的角度及得出结论的过程,所以会让人看起来觉得很简单,但是实际实现起来细枝末节的问题很多。

dao层扫描

首先根据我们多年开发的经验知道,dao层代码一般都是只定义接口类和方法,不会有交叉bean的引入的,所以第一步我们要先扫描dao层下的所有接口类。这里唯一和别的类不同的区别是dao的实例是动态代理实例,就是最终代码在调用接口方法时会监听该方法并由框架处理接口的实现。

service层扫描

把dao层下的所有接口扫描完,装载到内存中,按照完整类名作为key,实例对象作为value存入到dao的map缓存中,然后开始扫描servcie层下的包。由于servcie层包确认是不会引入controller层的bean的,所以处理起来会相对简单一点。

考虑到service层会依赖互相注入service层bean还会注入一些帮助类的bean,所以就得扫描自身类的同时继续通过反射把类的成员变量中的所有bean也扫描出来。拿到类的成员变量后根据类名去对应类型的缓存中查询下是否当前类的bean已经存在,​然后处理好创建和赋值操作。当类的成员变量也是bean且没有在缓存中存在实例,则继续对成员变量做扫描,直至扫描到最后一个bean为止。

controller层扫描

controller扫描还需要校验url不能重复,url上的注解不能为空等,也就这些和别的扫描有些区别。然后还需要把url和controller的方法映射存储起来,因为在做反射调用的时候是根据url来寻找controller类实例来执行对应方法的​。

component层扫描

这一层其实嵌套在service层内实现,也可以嵌套在controller内,在扫描上面的包的过程中扫描到component就已经完成了其bean的生成和注入了。

请求调度

整个所有的bean扫描完成后,就可以交由mvc的servlet调度控制类来做调度了。写一个servlet类拦截所有servlet请求,交由mvc控制其任务的调度、务的控制、参数包装、结果返回以及异常处理​。这样整个mvc的​部分就算开发完了。

特别的,dao层的使用一般我们还需要借助xml文件来存储sql文件,这是一个很方便书写、管理和移植拓展的解决方案。所以在mvc框架开发的最后一步就是把前期手写的字符串SQL替换为xml的mapper文件来处理​。而这个我也会单独​出章节来讲。在java最新的版本中已经支持字符串模板的写法了,它支持一段字符串的直接所见即所得的写法,非常适合写html和sql文件,到时候我在看下能不能走这条路来支持sql这一块的解析。​

asp.net mvc项目实例_降龙-第13章:MVC开发准备相关推荐

  1. 《软件需求分析(第二版)》第 13 章——需求开发面临的特殊难题 重点部分总结

    文章目录 前言 一.简答题 二.名词解释 总结 前言 软件需求分析就是把软件计划期间建立的软件可行性分析求精和细化,分析各种可能的解法,并且分配给各个软件元素.需求分析是软件定义阶段中的最后一步,是确 ...

  2. 一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)

    TZHSWEET:请大家多多反馈问题,我已经在修改中了,已更新版本...... 如果大家遇到数据库附加问题,EF连接字符串问题,请自行配置,如果有bug反馈可以私聊,我的qq:409180955. 项 ...

  3. ASP.NET Core 中文文档 第四章 MVC(4.2)控制器操作的路由

    原文:Routing to Controller Actions 作者:Ryan Nowak.Rick Anderson 翻译:娄宇(Lyrics) 校对:何镇汐.姚阿勇(Dr.Yao) ASP.NE ...

  4. ASP.NET Core 中文文档 第四章 MVC(4.3)过滤器

    原文:Filters 作者:Steve Smith 翻译:刘怡(AlexLEWIS) 校对:何镇汐 ASP.NET MVC 过滤器 可在执行管道的前后特定阶段执行代码.过滤器可以配置为全局有效.仅对控 ...

  5. ASP.NET Core 中文文档 第四章 MVC(3.9)视图组件

    作者: Rick Anderson 翻译: 娄宇(Lyrics) 校对: 高嵩 章节: 介绍视图组件 创建视图组件 调用视图组件 演练:创建一个简单的视图组件 附加的资源 查看或下载示例代码 介绍视图 ...

  6. java mvc 绑定_关于Java:Spring MVC:将请求属性绑定到控制器方法参数

    在Spring MVC中,很容易将请求参数绑定到处理请求的方法参数. 我只是使用@RequestParameter("name"). 但是我可以对request属性做同样的事情吗? ...

  7. ASP.NET Core 中文文档 第四章 MVC(2.2)模型验证

    原文:Model Validation 作者:Rachel Appel 翻译:娄宇(Lyrics) 校对:孟帅洋(书缘) 在这篇文章中: 章节: 介绍模型验证 验证 Attribute 模型状态 处理 ...

  8. 网工视频13第13章.计算机系统开发运行与配置疑难问题

    网工视频请留下你的邮箱,我给你发邮件. 转载于:https://blog.51cto.com/ricebetter2010/155609

  9. java类库支持_第十二章:开发支持类库

    UUID类 UUID(since 1.5   java.util.UUID)是一种生成无重复字符串的程序类,这种程序类的主要功能是根据时间戳实现一个自动的无重复的字符串定义.所谓的无重复只出现概率很低 ...

最新文章

  1. P1115 最大子段和
  2. P4294-[WC2008]游览计划【斯坦纳树】
  3. android thread实例
  4. mysql begin end 用法_MySQL ------ 游标(CURSOR)(二十六)
  5. pppoe linux 配置文件,linux PPPOE服务端配置
  6. C语言orC++,最大的区别?
  7. 做python开发要用多大的内存卡_编程用surface怎么样发(学python要多大内存)
  8. oracle索引可以加到in,为什么你加的索引不管用?
  9. bash不能运行c语言,解决:无法加载文件 C:\\Program Files\\.. 因为在此系统上禁止运行脚本。...
  10. java 帕斯卡_Java编程实现帕斯卡三角形代码示例
  11. python程序填空快乐的数字_Python习题之快乐的数字
  12. 2019在职跨考南大计算机非全日制专硕-初试364经验帖
  13. 学校计算机房的布线注意要点,学校机房布线要点探析
  14. 阿里物联网iot 网关配置 gateway 与子设备
  15. 前台js中图片picture设置
  16. 【Codeforces Round #514 (Div. 2) D. Nature Reserve】 三分+推公式
  17. JAVA电机控制程序_步进电机控制时序
  18. Android修改读写速度,技术宅 篇一:如何让旧安卓手机的速度重新飞一会儿(使用开发者选项)通过改设置加快速度...
  19. sqlserver 数据库正在使用,无法删除
  20. Windows10 pc使用Apple Studio Display显示器设置

热门文章

  1. Laravel db:seed 报错 [ReflectionException] Class XXX does not exist
  2. REST架构下,浏览器怎么发送put与delete请求?
  3. 使用 UML 进行业务建模:理解业务用例与系统用例的相似和不同之处
  4. 关于jstl在tomcat5和tomcat6的部署
  5. android9系统webview崩溃,Android WebView已开始在Android 9上崩溃
  6. Binary String Reconstruction CodeForces - 1352F(思维+构造)
  7. PolandBall and Forest(并查集)
  8. 虚拟机中使用Samba实现文件共享,并在win10上创建映射网络驱动器
  9. 计算机系学生mac,大学生选择苹果电脑之后的经验之谈
  10. pandas删除数据库 python_Python常见的科学计算库