最近工作之余闲来无事,突发奇想,想着尝试下自己不用Spring以及SpringMVC框架,就用原生来实现相关功能,于是又温习了下spring相关的资料,最后终于捣鼓出来一个玩意,所以写点东西总结,废话不多说了,先看看他们的工作原理,这个之前我的博客里面也说过,再拿过来给大家看看。
SpringMVC
SpringMVC基于servlet原理实现,Spring提供了DispatcherServlet,这个类不仅负责实现请求转发, 还负责启动一个WebApplicationContext容器。
按照Spring一贯的IoC哲学,所有的Controller都是 JavaBean,并由IOC容器统一管理。
对于View,则采取了更灵活的处理方 式,Spring MVC允许使用不同的View实现,除了JSP外,还可以使用Velocity、Freemaker、XSLT等多种View技术。
客户端发出一个http请求给web服务器,web服务器对http请求进行解析,如果匹配DispatcherServlet的请求映射路径(在web.xml中指定),web容器将请求转交给DispatcherServlet.
DipatcherServlet接收到这个请求之后将根据请求的信息(包括URL、Http方法、请求报文头和请求参数Cookie等)以及HandlerMapping的配置找到处理请求的处理器(Handler)。
DispatcherServlet根据HandlerMapping找到对应的Handler,将处理权交给Handler(Handler将具体的处理进行封装),再由具体的HandlerAdapter对Handler进行具体的调用。
Handler对数据处理完成以后将返回一个ModelAndView()对象给DispatcherServlet。
Handler返回的ModelAndView()只是一个逻辑视图并不是一个正式的视图,DispatcherSevlet通过 ViewResolver将逻辑视图转化为真正的视图View。
Dispatcher通过model解析出ModelAndView()中的参数进行解析最终展现出完整的view并返回给客户端。
Spring
Spring即一个AOP框架,也是一IOC容器。 内部最核心的就是IOC了,动态注入,让一个对象的创建不用new了,可以自动的生产,这其实就是利用java里的反射,反射其实就是在运行时动态的去创建、调用对象,Spring就是在运行时,跟xml Spring的配置文件来动态的创建对象,和调用对象里的方法的 。
Spring还有一个核心就是AOP这个就是面向切面编程,可以为某一类对象 进行监督和控制(也就是 在调用这类对象的具体方法的前后去调用你指定的 模块)从而达到对一个模块扩充的功能。这些都是通过 配置类达到的。
开始前的准备工作
了解了spring和springMVC的工作原理,我发现其实实现相关的功能也不是太难,首先你必须搞明白java的反射,代理机制,搞清楚这俩点就可以基本就可以搞定了。首先我们准备好环境,创建一个java项目,名字就叫myspring吧,准备好一些jar包,由于是原生的,不需要spring的jar了。
我准备的jar如下:
cglib-nodep-2.2.jar(实现无接口代理)
servlet-api.jar(这就不用说了吧)
dom4j-1.6.1.jar(解析xml)
commons系jar(主要用在jdbc方面)
首先创建Servlet
我们也创建一个DispatcherServlet,就按照spring的风格吧,我创建的类名:
com.myspringframework.web.servlet.DispatcherServlet,然后在web.xml里面配置好,配置信息如下:
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>com.myspringframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>
classpath:applicationContext.xml
</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet