程序员人生 网站导航

Spring学习总结(19)——Spring概念详解

栏目:框架设计时间:2016-11-17 09:26:12
Spring是1个开源框架,Spring是于2003 年兴起的1个轻量级的Java 开发框架,由Rod Johnson创建。简单来讲,Spring是1个分层的JavaSE/EEfull-stack(1站式) 轻量级开源框架。
你可能正在想“Spring不过是另外1个的framework”。当已有许多开放源代码(和专有)J2EEframework时,我们为何还需要Spring Framework?
Spring是独特的,由于若干个缘由:
它定位的领域是许多其他流行的framework没有的。Spring致力于提供1种方法管理你的业务对象。
Spring是全面的和模块化的。Spring有分层的体系结构,这意味着你能选择使用它孤立的任何部份,它的架构依然是内在稳定的。因此从你的学习中,你可得到最大的价值。例如,你可能选择仅仅使用Spring来简单化JDBC的使用,或用来管理所有的业务对象。
它的设计从底部帮助你编写易于测试的代码。Spring是用于测试驱开工程的理想的framework。
Spring对你的工程来讲,它不需要1个以上的framework。Spring是潜伏地1站式解决方案,定位于与典型利用相干的大部份基础结构。它也触及到其他framework没有斟酌到的内容。

背景


Rod Johnson在2002年编著的《Expert one on one J2EE design and development》1书中,对Java EE 系统框架臃肿、低效、脱离现实的种种现状提出了质疑,并积极寻求探索革新
之道。以此书为指点思想,他编写了interface21框架,这是1个力图冲破Java EE传统开发的窘境,从实际需求动身,着眼于轻便、灵巧,易于开发、测试和部署的轻量级开发框架。Spring框架即以interface21框架为基础,经太重新设计,其实不断丰富其内涵,于2004年3月24日,发布了1.0正式版。同年他又推出了1部可谓经典的力作《Expert one-on-one J2EE Development without EJB》,该书在Java世界掀起了轩然大波,不断改变着Java开发者程序设计和开发的思考方式。在该书中,作者根据自己多年丰富的实践经验,对EJB的各种笨重臃肿的结构进行了逐1的分析和否定,并分别以简洁实用的方式替换之。至此1战功成,Rod Johnson成为1个改变Java世界的大师级人物。
传统J2EE利用的开发效力低,利用服务器厂商对各种技术的支持并没有真正统1,致使J2EE的利用没有真正实现Write Once及Run Anywhere的许诺。Spring作为开源的中间件,独立于各种利用服务器,乃至不必利用服务器的支持,也能提供利用服务器的功能,如声明式事务、事务处理等。
Spring致力于J2EE利用的各层的解决方案,而不是仅仅专注于某1层的方案。可以说Spring是企业利用开发的“1站式”选择,并贯穿表现层、业务层及持久层。但是,Spring其实不想取代那些已有的框架,而是与它们无缝地整合。

框架特点


轻量——从大小与开消两方面而言Spring都是轻量的。完全的Spring框架可以在1个大小只有1MB多的JAR文件里发布。并且Spring所需的处理开消也是微不足道的。另外,Spring是非侵入式的:典型地,Spring利用中的对象不依赖于Spring的特定类。
控制反转——Spring通过1种称作控制反转(IoC)的技术增进了低耦合。当利用了IoC,1个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或查找依赖对象。你可以认为IoC与JNDI相反——不是对象从容器中查找依赖,而是容器在对象初始化时不等对象要求就主动将依赖传递给它。
面向切面——Spring提供了面向切面编程的丰富支持,允许通过分离利用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚性的开发。利用对象只实现它们应当做的——完成业务逻辑——仅此而已。它们其实不负责(乃至是意识)其它的系统级关注点,例如日志或事务支持。
容器——Spring包括并管理利用对象的配置和生命周期,在这个意义上它是1种容器,你可以配置你的每一个bean如何被创建——基于1个可配置原型(prototype),你的bean可以创建1个单独的实例或每次需要时都生成1个新的实例——和它们是如何相互关联的。但是,Spring不应当被混淆于传统的重量级的EJB容器,它们常常是庞大与笨重的,难以使用。
框架——Spring可以将简单的组件配置、组合成为复杂的利用。在Spring中,利用对象被声明式地组合,典型地是在1个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),将利用逻辑的开发留给了你。
MVC——Spring的作用是整合,但不单单限于整合,Spring 框架可以被看作是1个企业解决方案级别的框架。客户端发送要求,服务器控制器(由DispatcherServlet实现的)完成要求的转发,控制器调用1个用于映照的类HandlerMapping,该类用于将要求映照到对应的处理器来处理要求。HandlerMapping 将要求映照到对应的处理器Controller(相当于Action)在Spring 当中如果写1些处理器组件,1般实现Controller 接口,在Controller 中就能够调用1些Service 或DAO 来进行数据操作 ModelAndView 用于寄存从DAO 中取出的数据,还可以寄存响应视图的1些数据。 如果想将处理结果返回给用户,那末在Spring 框架中还提供1个视图组件ViewResolver,该组件根据Controller 返回的标示,找到对应的视图,将响应response 返回给用户。
所有Spring的这些特点使你能够编写更干净、更可管理、并且更容易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

特性


强大的基于 JavaBeans的采取控制反转(Inversion of Control,IoC)原则的配置管理,使得利用程序的组件更加快捷简易。
1个可用于从 applet 到 Java EE 等不同运行环境的核心 Bean 工厂。
数据库事务的1般化抽象层,允许宣布式(Declarative)事务管理器,简化事务的划分使之与底层无关。
内建的针对 JTA 和 单个 JDBC 数据源的1般化策略,使 Spring 的事务支持不要求 Java EE 环境,这与1般的 JTA 或 EJB CMT 相反。
JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码), 简化了毛病处理, 大大减少了程序员的编码量. 再次利用JDBC时,你无需再写出另外一个 '终止' (finally) 模块. 并且面向JDBC的异常与Spring 通用数据访问对象(Data Access Object) 异常等级相1致.
以资源容器,DAO 实现和事务策略等情势与 Hibernate,JDO 和 iBATIS SQL Maps 集成。利用众多的反转控制方便特性来全面支持, 解决了许多典型的Hibernate集成问题. 所有这些全部遵从Spring通用事务处理和通用数据访问对象异常等级规范.
灵活的基于核心 Spring 功能的 MVC 网页利用程序框架。开发者通过策略接口将具有对该框架的高度控制,因此该框架将适应于多种显现(View)技术,例如 JSP,FreeMarker,Velocity,Tiles,iText 和 POI。值得注意的是,Spring 中间层可以轻易地结合于任何基于 MVC 框架的网页层,例如 Struts,WebWork,或 Tapestry。
提供诸如事务管理等服务的面向切面编程(AOP)框架。[1] 

特点


1.方便解耦,简化开发
通过Spring提供的IoC容器,我们可以将对象之间的依赖关系交由Spring进行控制,避免硬编码所酿成的过度程序耦合。有了Spring,用户没必要再为单实例模式类、属性文件解析等这些很底层的需求编写代码,可以更专注于上层的利用。
2.AOP编程的支持
通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付。
3.声明式事务的支持
在Spring中,我们可以从单调烦闷的事务管理代码中摆脱出来,通过声明式方式灵活地进行事务的管理,提高开发效力和质量。
4.方便程序的测试
可以用非容器依赖的编程方式进行几近所有的测试工作,在Spring里,测试不再是昂贵的操作,而是随手可做的事情。例如:Spring对Junit4支持,可以通过注解方便的测试Spring程序。
5.方便集成各种优秀框架
Spring不排挤各种优秀的开源框架,相反,Spring可以下降各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate、Hessian、Quartz)等的直接支持。
6.下降Java EE API的使用难度
Spring对很多难用的Java EE API(如JDBC,JavaMail,远程调用等)提供了1个薄薄的封装层,通过Spring的简易封装,这些Java EE API的使用难度大为下降。
7.Java 源码是经典学习范例
Spring的源码设计精巧、结构清晰、独具匠心,处处体现着大师对Java设计模式灵活应用和对Java技术的精深成就。Spring框架源码无疑是Java技术的最好实践范例。如果想在短时间内迅速提高自己的Java技术水平和利用开发水平,学习和研究Spring源码将会使你收到意想不到的效果。

好处


在我们进入细节之前,让我们看1下Spring可以给1个工程带来的1些好处:
Spring能有效地组织你的中间层对象,不管你是不是选择使用了EJB。如果你仅仅使用了Struts或其他的包括了J2EE特有APIs的framework,你会发现Spring关注了遗留下的问题。Spring能消除在许多工程上对Singleton的过量使用。根据我的经验,这是1个主要的问题,它减少了系统的可测试性和面向对象特性。
Spring能消除使用各种各样格式的属性定制文件的需要,在全部利用和工程中,可通过1种1致的方法来进行配置。曾感到迷惑,1个特定类要查找迷幻般的属性关键字或系统属性,为此不能不读Javadoc乃至源编码吗?有了Spring,你可很简单地看到类的JavaBean属性。颠倒控制的使用(在下面讨论)帮助完成这类简化。
Spring能通过接口而不是类增进好的编程习惯,减少编程代价到几近为零。
Spring被设计为让使用它创建的利用尽量少的依赖于他的APIs。在Spring利用中的大多数业务对象没有依赖于Spring。
使用Spring构建的利用程序易于单元测试。
Spring能使EJB的使用成为1个实现选择,而不是利用架构的必定选择。你能选择用POJOs或local EJBs来实现业务接口,却不会影响调用代码。
Spring帮助你解决许多问题而无需使用EJB。Spring能提供1种EJB的替换物,它们适于许多web利用。例如,Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道,乃至不需要JTA实现。
Spring为数据存取提供了1致的框架,不论是使用JDBC或O/R mapping产品(如Hibernate)。
Spring确切使你能通过最简单可行的解决办法解决你的问题。这些特性是有很大价值的。
总结起来,Spring有以下优点:
1.低侵入式设计,代码污染极低
2.独立于各种利用服务器,基于Spring框架的利用,可以真正实现Write Once,Run Anywhere的许诺
3.Spring的DI机制下降了业务对象替换的复杂性,提高了组件之间的解耦
4.Spring的AOP支持允许将1些通用任务如安全、事务、日志等进行集中式管理,从而提供了更好的复用
5.Spring的ORM和DAO提供了与第3方持久层框架的良好整合,并简化了底层的数据库访问
6.Spring其实不强迫利用完全依赖于Spring,开发者可自由选用Spring框架的部份或全部

作用


Spring提供许多功能,在此我将快速地顺次展现其各个主要方面。
首先,让我们明确Spring范围。虽然Spring覆盖了许多方面,但我们已有清楚的概念,它甚么应当触及和甚么不应当触及。
Spring的主要目的是使JavaEE易用和增进好编程习惯。
Spring不重新开发已有的东西。因此,在Spring中你将发现没有日志记录的包,没有连接池,没有散布事务调度。这些均有开源项目提供(例如Commons Logging 用来做所有的日志输出,或Commons DBCP用来作数据连接池),或由你的利用程序服务器提供。由于一样的的缘由,我们没有提供O/R mapping层,对此,已有友好的解决办法如Hibernate和JDO。Spring的目标是使已存在的技术更加易用。
例如,虽然我们没有底层事务调和处理,但我们提供了1个抽象层覆盖了JTA或任何其他的事务策略。
Spring没有直接和其他的开源项目竞争,除非我们感到我们能提供新的1些东西。例如,像许多开发人员,我们历来没有为Struts高兴过,并且感到在MVC web framework中还有改进的余地。在某些领域,例如轻量级的IoC容器和AOP框架,Spring有直接的竞争,但是在这些领域还没有已较为流行的解决方案。(Spring在这些区域是开路先锋。)
Spring也得益于内在的1致性。
所有的开发者都在唱一样的的赞歌,基础想法仍然是Expert One-on-One J2EE设计与开发的那些。
并且我们已能够使用1些主要的概念,例如颠倒控制,来处理多个领域。
Spring在利用服务器之间是可移植的。
固然保证可移植性总是1次挑战,但是我们避免任何特定平台或非标准化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的利用服务器上的用户。

基本框架


Spring 框架是1个分层架构,由 7 个定义良好的模块组成。Spring
模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如图所示:
组成Spring框架的每一个模块(或组件)都可以单独存在,或与其他1个或多个模块联合实现。每一个模块的功能以下:
1、核心容器:核心容器提供 Spring 框架的基本功能(Spring Core)。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转(IOC) 模式将利用程序的配置和依赖性规范与实际的利用程序代码分开。
2、Spring 上下文:Spring 上下文是1个配置文件,向 Spring框架提供上下文信息。Spring 上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。
3、Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向切面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持AOP。Spring AOP 模块为基于 Spring 的利用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就能够将声明性事务管理集成到利用程序中。
4、Spring DAO:JDBCDAO抽象层提供了成心义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的毛病消息。异常层次结构简化了毛病处理,并且极大地下降了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
5、Spring ORM:Spring 框架插入了若干个ORM框架,从而提供了 ORM 的对象关系工具,其中包括JDO、Hibernate和iBatisSQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
6、Spring Web 模块:Web 上下文模块建立在利用程序上下文模块之上,为基于 Web 的利用程序提供了上下文。所以,Spring框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部份要求和将要求参数绑定到域对象的工作。
7、Spring MVC 框架:MVC框架是1个全功能的构建 Web利用程序的 MVC 实现。通过策略接口,MVC框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。模型由javabean构成,寄存于Map;视图是1个接口,负责显示模型;控制器表示逻辑代码,是Controller的实现。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE 环境(Web 或EJB)、独立利用程序、测试环境之间重用。

下载安装


下载和安装Spring请按以下步骤进行。
(1)登录站点,下载Spring的最新稳定版本。最新版本为spring-framework⑷.0.建议下载spring-framework-spring-framework⑷.0.0.M2-dist这个紧缩包不但包括Spring的开发包,而且包括Spring编译和运行所依赖的第3方类库。
解紧缩下载到的紧缩包,解紧缩后的文件夹利用以下几个文件夹。
dist:该文件夹下放Spring的jar包,通常只需要Spring.jar文件便可。该文件夹下还有1些类似spring-Xxx.jar的紧缩包, 这些紧缩包是spring.jar紧缩包的子模块紧缩包。除非肯定全部J2EE利用只需要使用Spring的某1方面时,才斟酌使用这类分模块紧缩包。通常建议使用Spring.jar
docs:该文件夹下包括spring的相干文档、开发指南及API参考文档。
lib:该文件夹下包括spring编译和运行所依赖的第3方类库,该路径下的类库其实不是spring必须的,但如果需要使用第3方类库的支持,这里的类库就是必须要的。
samples:该文件夹下包括Spring的几个简单例子,可作为Spring入门学习的案例。
src:该文件夹下包括Spring的全部源文件,如果开发进程中有地方没法掌控,可以参考该源文件,了解底层实现。
test:该文件夹下包括Spring的测试示例。
tiger:该路径下寄存关于JDK的相干内容
解紧缩后的文件夹下,还包括1些关于Spring的License和项目相干文件
(2)将spring.jar复制到项目的CLASSPATH路径下,对Web利用,将spring.jar文件复制到WEB-INF/lib路径下,该利用便可以利用Spring框架了。
(3)通常Spring的框架还依赖于其他1些jar文件,因此还须将lib下对应的包复制到WEB-INF/lib路径下,具体要复制哪些jar文件,取决于利用所需要使用的项目。通常需要复制cglib,dom4j,jakarta-commons,log4j等文件夹下的jar文件。
(4)为了编译java文件,可以找到Spring的基础类,将Spring.jar文件的路径添加到环境变量CLASSPATH中。固然,也能够使用ANT工具,但不必添加环境变量。如果使用Eclipse或NetBeans等IDE时,也不需要设置环境变量。
Spring MVC
传统的web架构的view 表现层使用struts作为表现层。但是如果试用下spring自带的MVC,会发现spring 在1般场合完全可以取代struts。从某些角度来讲,spring的mvc设计的更加公道,有兴趣的话无妨尝试下单个的spring的MVC。

利用实例


  1. 新建1个登陆页面:loginActionSupport.jsp,代码以下
<%@page contentType="text/html;charset=GBK" isELIgnored="false"%>
<html>
<head><title>;实现用户登录实例,struts和Spring整合</title></head>
<body>
<font size=’22’> $<br> </font>
<form name="form1" action="/myLogin/loginActionSupportdo" method="post">
用户名:<input type="text" name="username" value="${user.username}"/><br>
密码:<input type="password" name="password" value="${user.password}"/><br>
<input type="submit" name=”method” value="提交"/>
</form>
</body>
</html>
2.创建1个存储登陆用户信息的类:User.java该类继承于ActionForm,代码以下:
package com.zhaosoft.bean;
import org.apache.struts.action.ActionForm;
public class User extends ActionForm{
private String username=null;
private String password=null;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;}
public void setPassword(String password) {
this.password = password;
}
}
3.Com.zhaosoft.action中新建1个LoginActionSupport.java,该类不继承于struts的Action,而是继承于Spring的ActionSupport,代码示例以下:
package com.zhaosoft.action;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.springframework.context.ApplicationContext;
import org.springframework.web.struts.ActionSupport;
import com.zhaosoft.bean.User;
import com.zhaosoft.domain.Login;
public class LoginActionSupport extends ActionSupport {
public ActionForward execute(ActionMapping mapping,ActionFormform,
HttpServletRequest request,HttpServletResponse response)
throws Exception {
// 通过ApplicationContext获得配置文件
ApplicationContext ctx = getWebApplicationContext();
Login login = (Login) ctx.getBean("login");
login.login((User) form);
request.setAttribute("msg",login.getMsg());
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐