SSM(Spring+SpringMVC+MyBatis)框架集由Spring、MyBatis两个开源框架整合而成(SpringMVC是Spring中的部分内容)。常作为数据源较简单的web项目的框架。今天,咱们就在一起认识学习SSM架构。
Spring框架
Spring框架是Java应用最广的框架。它的成功来源于理念,而不是技术本身,它的理念包括IoC(InversionofControl,控制反转)和AOP(AspectOrientedProgramming,面向切面编程)。
SpringloC简介
IoC是一个容器,在Spring中,它会认为--切Java资源都是JavaBean,容器的目标就是管理这些Bean和它们之间的关系。所以在SpringIoC里面装载的各种Bean,也可以理解为Java的各种资源,包括JavaBean的创建、事件、行为等,它们由IoC容器管理。除此之外,各个JavaBean之间会存在一定的依赖关系,比如班级是依赖于老师和学生组成的,假设老师、学生都是JavaBean,那么显然二者之间形成了依赖关系,老师和学生有教育和被教育的关系。这些SpringIoC容器都能够对其进行管理。只是SpringIoC管理对象和其依赖关系,采用的不是人为的主动创建,而是由SpringIoC自己通过描述创建的,也就是说Spring是依靠描述来完成对象的创建及其依赖关系的。
比如插座,它依赖国家标准(这个标准可以定义为一个接口,Socket)去定义,现有两种插座(Socket1和Socket2),如下图所示。
有两种插座可供选择,具体使用哪种呢?我们可以通过代码来实现使用插座1(Socket1)。
Socketsocket=newSocket1();
user.setSocket(socket);
user.useSocket();
使用Socketsocket=newSocket10);后,国家标准插座接口(Socket)就和插座1(Socket1)捆绑在一起了。这样就会有一一个弊端:如果要使用其他的插座,就需要修改代码了。这种情况Socket接口和其实现类Socketl耦合了,如果有一天不再使用Socketl,而是要使用Socket2,那么就要把代码修改为以下示例。
Socketsocket=newSocket2();
user.setSocket(socket);
user.useSocket();
如果有其他更好的插座,岂不是还要修改源码?一个大型互联网的对象成千上万,如果要不断修改,那么对系统的可靠性将是极大的挑战,SpringIoC可以解决这个问题。首先,我们不用new的方式创建对象,而是使用配置的方式,然后让SpringIoC容器自己通过配置去找到插座。先用一段XML描述插座和用户的引用插座1,如下图
beanid=socketclass=Socket1/
beanid=userclass=xxx.User
propertyname=socketref=socket/
/bean
请注意这些不是Java代码,而是XML配置文件,换句话说只要把配置切换为:
beanid=“scocket”class=Socket2
就可以往用户信息中注入插座2,切换插座的实现类十分方便。这个时候Socket接口就可以不依赖任何插座,而通过配置进行切换,如下图所示。
上图的配置信息是“我要插座2”,相当于XML依赖关系配置,这个时候SpringIoC只会拿到插座2,然后通过国家标准插座接口注入给使用者,提供给使用者使用。换句话说,这是一种被动的行为,而需要的资源(Bean)通过描述信息就可以得到,其中的控制权在SpringIoC容器中,它会根据描述找到使用者需要的资源,这就是控制反转的含义。
这样的好处是Socket接口不再依赖于某个实现类,需要使用某个实现类时我们通过配置信息就可以完成了。这样想修改或者加入其他资源就可以通过配置完成,不需要再用new关键字进行创建对象,依赖关系也可以通过配置完成,从而完全可以即插即拔地管理它们之间的关系。
你不需要去找资源,只要向SpringloC容器描述所需资源,SpringIoC自己会找到你所需要的资源,这就是SpringIoC的理念。这样就把Bean之间的依赖关系解耦了,更容易写出结构清晰的程序。除此之外,SpringIoC还提供对JavaBean生命周期的管理,可以延迟加载,可以在其生命周期内定义一些行为等,更加方便有效地使用和管理Java资源,这就是SpringIoC的魅力。
SpringAOP
IoC的目标就是为了管理Bean,而Bean是Java面向对象(OOP)的基础设计,比如声明一个用户类、插座类等都是基于面向对象的概念。
有些情况是面向对象没办法处理的。举个例子,生产部门的订单、生产部门、财务部门三者符合OOP的设计理念。订单发出,生产部门审批通过准备付款,但是财务部门发现订单的价格超支了,需要取消订单。显然超支限定已经不只是影响财务部门了,还会影响生产部门之前所做的审批,需要把它们作废。我们把预算超支这个条件称为切面,它影响了订单、生产部门和财务部门3个OOP对象。在现实中,这样的切面条件跨越了3个甚至更多的对象,并且影响了它们的协作。所以只用OOP并不完善,还需要面向切面的编程,通过它去管理在切面上的某些对象之间的协作,如下图所示。
在上图中,实线是订单提交的流程,虚线是订单驳回的流程,影响它们的条件是预算超额,这是一个切面条件。
SpringAOP常用于数据库事务的编程,很多情况都如同上面的例子,我们在做完第一步数据库数据更新后,不知道下一步是否会成功,如果下一一步失败,会使用数据库事务的回滚功能去回滚事务,使得第-步的数据库更新也作废。在SpringAOP实现的数据库事务管理中,是以异常作为消息的。在默认的情况下(可以通过Spring的配置修改),只要Spring接收到了异常信息,它就会将数据库的事务回滚,从而保证数据的一致性。这样我们就知道在Spring的事务管理中只要让它接收到异常信息,它就会回滚事务,而不需要通过代码来实现这个过程。比如上面的例子,可用一段伪代码来进行一些必要的说明,
这里我们完全看不到数据库代码,也没有复杂的try...catch...finally...语句。在现实中,SpringAOP的编程也是如此,这些东西都被Spring屏蔽了,不需要
转载请注明:http://www.0431gb208.com/sjszlff/2001.html