第一部分,spring框架预览
spring框架是一个轻型的一站式构建你的企业应用的解决方案。spring是模块化的,允许你单独的使用其中的一部分。在前端你能够与Struts一起使用ioc容器,而你也能够仅使用Hibernate整合代码或者JDBC的抽象层。spring框架支持声明式的事物管理、通过RMI或者web服务进行远程调用以及多种方式去调用你的数据。它提供了MVC框架的全部特性也能够显式的将AOP特性整合到你的应用中。
spring的设计是非侵入式的,这意味着,你的业务逻辑代码不需要去依赖框架本身。在你的整合层上(如某些数据访问层),依赖了某些数据访问技术和spring的类库。但这些都是非常简单能够与你的基础代码进行隔离的。
本文档是spring功能的参考手册,如果对于本文档你有任何的问题,请给我们发邮件或者访问论坛:http://forum.springsource.org
1.spring框架介绍
spring框架为开发java应用程序提供一个java平台全面的基础框架,使开发人员集中精力在具体的业务应用上。
spring能够帮助你使用pojo构建你的应用程序,并使你的程序非侵入式的调用这些pojo。这种能力可以使用在J2SE程序中,也可以全部或者部分的使用在J2EE上。
举例说明,作为一个开发人员,使用spring框架的优势在于:
● 编写java应用去访问一个数据库事务时,不需要去关注那些事务API
● 编写java本地程序调用远程过程时,不需要去关心远程调用API
● 编写java本地程序去管理操作,不需要去关心JMX API
● 编写java本地程序处理消息,不需要去关心JMS API
1.1 依赖注入和控制反转
java应用(作为一种不准确的定义,它涵盖了运行于applet容器到n层服务器端企业应用的各种应用)一般包含各种对象的有机组合。这些应用中的对象互相依赖。
虽然java平台提供了大量的应用程序开发功能,但它缺乏脱离架构和开发人员有效组织基础模块成为整体的手段。实际上,你能够用多种设计模式将类和对象实例化生产应用程序。然而,这些设计模式仅在他们所给定的名称、背景下是一个最佳的实践。设计模式在你的应用程序中必须由你自己去实现。
spring框架的控制反转组件对这个问题提供了一个截然不同的组件为完整的正在工作中的应用程序使用。spring框架将设计模式编辑整理为一级对象供应用程序使用。许多机构和组织使用spring框架的方法构建强健、稳定的应用。
1.2 模块
spring框架由大约20个模块组成。这些模块分布在核心容器、数据访问/集成、web、AOP(面向切面编程)、仪表和测试。如下图所示
1.2.1 核心容器
核心容器由Core、Beans、Context和Expression Language 模块组成
Core和Beans模块作为框架的基础模块包含控制反转和依赖注入的功能。BeanFactory是一个工厂模式的复杂实现。它消除了程序对单例的需要,允许将你的程序与配置文件进行解耦。
Context模块构建在Core和Beans模块的实际提供者之上:它以一种类似JDNI注册的框架方式去访问对象。Context模块从Beans模块继承了这些特性并增加了对于国际化(使用、范例、资源Bundle),事件传播,资源读取和透明创建环境、范例、servlet容器的支持。Context模块也支持J2EE特性,如:EJB、JMX和基础远程调用。ApplicationContext是Context模块的核心。
Expression Language 提供了为查询和控制对象关系一种表达式语法。它是一种作为JSP2.1标准的统一表达式语言的延伸。语言支持设置、取出属性的值、属性配置、方法调用、访问数组、集合和索引、逻辑和算术运算符、命名变量、从Spring框架的IoC容器中依赖名称的对象检索。它也支持列表投影和选择以及常见的列表聚合。
1.2.2 数据访问和整合
数据访问和整合层由JDBC、ORM、OXM、JMS和事物模块组成。
JDBC模块提供一个抽象的JDBC层,避免了沉闷的JDBC编码和错误处理的过程。
ORM模块提供对象映射API包括JPA、JDO、Hibernate、IBatis的整合层。使用ORM包,你能够使用将所有这些O/R映射框架结合Spring提供的特性一起使用,如之前提到的简单定义的事物框架。
OXM模块为JAXB、Castor、XMLBeans、JiBX和XStream提供了一抽象的对象到XML映射的支持。
JMS模块提供生产、消费消息的特性。
事物模块为实现特定接口的类和所有的POJO提供编程和声明式的事物管理
1.2.3 Web
Web层由Web, Web-Servlet, Web-Struts 和 Web-Portlet 模块组成
Spring Web模块提供基础的web特性,如文件上传功能和使用servlet监听初始化IoC容器和应用程序上下文。它还包含了web相关的Spring远程调用支持。
Web-Servlet模块包含Spring MVC的实现。Spring MVC框架明确的分割了领域模型和web表单,并整合了Spring框架的其他特性。
Web-Struts模块支持将Spring应用于经典的Struts Web层整合。注意,这种支持在Spring3.0中已经被废弃,建议使用Struts2.0与spring整合或者使用SpringMVC框架。
Web-Porlet模块支持将MVC在portlet环境和Web-Servlet模块的镜像功能中实现。
1.2.4 AOP和仪表
Spring AOP模块提供一个与AOP联盟面向对象编程兼容的实现,允许你去定义、示例、方法拦截和切入点,将这些与代码的实现解耦。使用源代码级的元数据功能,你能将行为信息包含在你的代码中,类似.net的属性。
分割切面模块提供与AspectJ的整合
仪表模块提供class仪表支持和用于某些应用服务器的classloader实现
1.2.5 测试
测试模块支持Spring组件的JUnit或者TestNG测试。它提供统一的方法访问Spring应用程序上下文和缓存。同时提供Mock对象使测试时代码隔离。
1.3 应用场景
上文所述的模块,可以在许多场景中使用,从applet到全面的企业应用,从使用事务管理到web框架整合。
Spring的声明式事务控制特性使web应用完全的事务化,就像你使用EJB容器做事务管理一样。你所有的商业逻辑能够依靠Spring IoC通过简单POJO实现并管理。扩展服务包括发送邮件、根据选择的规则独立web层验证。SpringORM支持整合JPA、Hibernate、JDO和iBatis;例如Hibernate,你能够继续使用你的映射文件和标准的Hibernate SessionFactory配置。表单控制器无缝的整合到领域模型的web层,不再关心ActionForms和领域模型中用于传输HTTP参数的其他类。
有时,不允许你完整的切换到不同的框架。Spring框架不会强迫你使用任何东西。它不是一个全部/全不的解决方案。可以前端使用WebWork、Struts、Tapestry或者其他框架,中间层使用带事务特性Spring框架,你要做的就是使用ApplicationContext 和 WebApplicationContext 与你的Web层连接。
当你需要通过web 服务访问那些已经存在的代码时,你可以使用Spring的Hessian-, Burlap-, Rmi- or JaxRpcProxyFactory 类。远程访问那些已存在的应用就没有困难了。
Spring框架也支持EJB的访问和抽象层,你能够再次使用你的已经存在的POJO,能将他们封装成无状态Session Bean,在可扩展的,失败安全的Web应用中使用,这可能需要声明一些安全规则。
1.3.1 依赖管理和名称约定
依赖管理和依赖注入是不同的两个事情。使用这个特性(比如依赖注入)你需要将所有的库文件(jar files)放到你的运行时classpath中,最好编译时也可以找到。这些依赖关系不是虚拟组件的注入,而是文件系统上的物理资源。依赖管理的过程包括本地的这些资源,保存它们、把它们加到classpath中。依赖可以是直接的(比如应用程序在运行时的依赖)也可以是间接的(比如应用程序依赖commons-dbcp而它又依赖commons-pool)。间接依赖总是被传递的,确认和管理它们是很困难的。
如果你使用Spring,你需要赋值你使用的spring组件的组成类库。Spring将模块分别包装,使分割这些依赖更加容易,例如,你不想使用Spring的Web模块去写你的应用。引用Spring的类模块时,我们可以使用一个短名称spring-* 或者 spring-*.jar,这里的“*”代替模块的短名称(如: spring-core, spring-webmvc, spring-jms等等)。真是的名称,你也许能够在下面表格中找到,或者没有,通常他总是在文件名中有一个版本号(如:spring-core-3.0.0.RELEASE.jar)
通常Spring发布到如下4个地方:
。社区下载网站http://www.springsource.org/downloads/community 这里你能找到所有Spring的Jar文件被打包在一个zip文件里以方便下载。jar文件名称从3.0开始是这个样子org.springframework.*-<version>.jar.
。Maven库,默认的存储库,没有特定的配置。许多Spring依赖的类库和Spring社区使用的重要片段都在这里进行管理,所以,这里对它们是很方便的。jar文件的命名如:spring-*-<version>.jar,Maven的GroupId是org.springframework。
。EBR,这里有SpringSource运行,也管理所有Spring的整合类库。使用Maven和Ivy存储了Spring Jar包及所有依赖的类库还有大量的使用Spring构建应用的人们所使用的通用类库。
。开发的快照和里程碑版本放在Amazon S3的公共Maven库中(最终版本的拷贝在这里总是存在一份的)。这个jar文件的名字和Maven库的名称是一样的。所以对于从这里获得开发版本去开发Spring并提交到Maven库还是非常有用的。
所以,首先,你需要决定如何管理你的依赖:很多人使用自动化系统如Maven或者Ivy,但你也能够手工的下载这些jar包。当你决定通过Maven或者Ivy获得了Spring,你就可以获得他们。通常,如果你关心OSGI,使用EBR,获得这些Spring依赖的OSGI兼容版本,如Hibernate和Freemaker。如果OSGI不是你关心的,两个地方同时工作有利有弊。通常,你应该在一个地方工作或者另外启动一个项目,不混合使用它们。特别重要的一点是EBR的文档名称与Maven必须不同。
表1.1 Maven库和Spring EBR库对比
(略)
1.3.1.1 Spring依赖的和依赖Spring的
虽然Spring整合支持大量的企业级和其他扩展工具,有意的将它强制的依赖在一个最小的集合内。你不必为了使用Spring的一个简单用例而下载大量的Jar包。基础的依赖注入只有一个外部的依赖,那是为了记录日志(关于日志记录的详细配置将在下面介绍)。
下面我们概要的看一下使用Maven和Ivy架设在Spring上的应用的步骤。在任何情况下,如果有不清楚的,请参考你所使用的依赖管理系统的文档,或者看一些范例代码——Spring使用Ivy管理构建依赖和同样使用Maven的范例。
1.3.1.2 Maven依赖管理
如果你使用Maven管理依赖,不需要你明确的声明日志的依赖。例如,创建应用上下文,使用依赖注入配置应用时,你的Maven依赖就像下面这样:
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.0.0.RELEASE</version>
<scope>runtime</scope>
</dependency>
</dependencies>
就这样,作为一个基础的依赖注入范例,如果你不需要去编译Spring API ,范围可以在运行期声明。
(下略,感觉都是构建Spring 的,无太大意义)