IOC
IOC(Inversion Of Control)控制反转。两种实现方式:DL(依赖查找),DI(依赖注入)。Spring就是实现的DI。
IOC的想法是通过一个第三方的IOC容器实现各个相互依赖对象之间的解耦。通过引入IOC容器,可以使复杂系统中的各个对象不再相互依赖,使每个开发者可以只关注于实现自己的类,与别人的工作没有任何关系。比如在没有IOC容器这个“粘合剂”时,当类A代码的某个阶段,需要用到类B时,需要主动的创建对象B,或者调用已经创建好的B对象,也就是对象A依赖于对象B。而有了IOC容器,就可以实现类A不主动的创建B对象,在需要B对象的地方,IOC会创建一个对象B给对象A使用,这样对象A就与对象B失去了联系,创建B的行为也由A主动创建变成了IOC容器创建,A被动接受,也就是说A对B的控制权颠倒了过来,也就是IOC控制反转的名称的由来。
IOC的问题 1. IOC依赖反射,而反射在运行效率上有些损失,因此追求效率的项目需要斟酌对IOC的使用。2. 需要进行大量的配置工作,同时由于新引入的IOC容器使创建对象变得复杂,客观上增加了成本。
Spring中IOC的实现方式 Spring设计了两个接口来表示容器:BeanFactory和ApplicationContext,前者为低级容器,后者为高级容器,实际上,IOC只靠低级容器BeanFactory就可以实现。BeanFactory可以认为他是一个HashMap,key是beanname,value是该bean的实例。调用 getBean 的时候,从 BeanDefinition 所属的 Map 里,拿出 Class 对象进行实例化,同时,如果有依赖关系,将递归调用 getBean 方法, 完成依赖注入。上面就是 Spring 低级容器(BeanFactory)的 IoC。
MVC框架
MVC是Model—View—Controler的简称,它是一种架构模式,它分离了表现与交互。它被分为三个核心部件:模型、视图、控制器。
下面是每一个部件的分工:
Model(模型),是程序的主体部分,主要包含业务数据和业务逻辑。在模型层,还会涉及到用户发布的服务,在服务中会根据不同的业务需求,更新业务模型中的数据。
View(视图),是程序呈现给用户的部分,是用户和程序交互的接口,用户会根据具体的业务需求,在View视图层输入自己特定的业务数据,并通过界面的事件交互,将对应的输入参数提交给后台控制器进行处理。
Controller(控制器),Controller是用来处理用户输入数据,以及更新业务模型的部分。控制器中接收了用户与界面交互时传递过来的数据,并根据数据业务逻辑来执行服务的调用和更新业务模型的数据和状态。
通过这种设计模型把应用逻辑,处理过程和显示逻辑分成不同的组件实现,这些组件可以进行交互和重用。
使用MVC有哪些好处?
1.各司其职,互不干涉
在MVC模式中,三个层各施其职,所以如果一旦哪一层的需求发生了变化,就只需要更改相应的层中的代码而不会影响到其它层中的代码。
2.有利于开发中的分工
在MVC模式中,由于按层把系统分开,那么就能更好的实现开发中的分工。网页设计人员可以进行开发视图层中的JSP,对业务熟悉的开发人员可开发业务层,而其它开发人员可开发控制层。
3.有利于组件的重用
分层后更有利于组件的重用。如控制层可独立成一个能用的组件,视图层也可做成通用的操作界面。
SpringMVC细节,和Servlet的关系
一、首先说mvc和单独一个servlet的区别:
如果我的tomcat服务器要实现一个功能,比如说接收一个请求,从数据库里查出一条用户信息(select),然后返回到服务器,那么不用mvc的方法是:
只有一个servlet也可以实现,自定义一个servlet,在tomcat的web.xml的中注册,接收 /select 请求,在servlet里手写实现jdbc接口连接数据库完成查询,得到response的输出流,把查询结果write到页面上。这样耦合度很高,向页面上写response也很麻烦。
使用mvc模式可以降低耦合度,jsp也可以简化输出的过程。Controller层的servlet接受请求信息,调用Model层的Dao的方法实现与数据库的连接、查询,将查到的数据利用View层jsp技术显示给用户。
二、为什么要用springmvc:
这时候要再实现几个功能,向数据库中添加用户(insert),删除用户(delete),更改用户(update)等等功能,如果传统mvc模式怎么做?
(一)写几个新的servlet。然后在web.xml中注册新sevlet,并映射对应的/insert /delete /update /XXX,在这些新的servlet中调用View和Model层完成功能。
这样新定义servlet的方法比较麻烦,要去继承HttpServlet接口,实现接口方法,手写调用jsp的重定向或者请求转发,还要再web.xml中注册。
(二)直接在原来的servlet中添加方法。然后把web.xml中原来的/select改成 / 来映射所有请求,在原来的servlet中加入判断,不同的请求执行不同的方法。
这第(二)种实现方法,仔细想一想,是不是和springmvc就有点像了?这时这仅有一个的servlet就对应着springmvc中的DispatcherServlet,我们写的实现这些功能的方法就对应着springmvc中我们要写的很多controller,我们在servlet中写的判断,springmvc就通过处理器映射器、处理器适配器这两大组件帮我们实现了。即:
我们写的单一的servlet------------------------>springmvc的DispatcherServlet
我们servlet里的判断语句---------------------->处理器映射器,处理器适配器
我们servlet里的方法----------------------------->各种controller
三、总结
springmvc框架三大组件(DispatcherServlet,处理器映射器,处理器适配器)就是一个可以处理多种请求的强大的servlet。它长这样:
public class DispatcherServlet implements Servlet{
//main方法
public void main{
if(映射器说要执行A){
this.controllerA();
}
if(映射器判断要执行B){
this.controllerB(<