第一章 Spring.Net介绍
1.1 概述
在Java社区中Spring经历的长时间的考验,已经是一套很成熟稳定的框架。而Spring.Net 的前身是 Java版的Spring。Spring.Net是以Java版的Spring框架为基础,将Spring(Java版)的概念和编程思想移植到.Net平台上来。
Spring.Net 是一个应用程序框架,它的目的是帮助软件开发人员创建企业级的.Net应用程序。它提供了很多方面的功能,比如依赖注入,面向切面编程(AOP),数据访问抽象以及ASP.Net扩展等等的功能。
Spring.Net 框架是一套轻量级的面向企业级应用的开源框架。Spring.Net 不仅是开源的,而且Spring.Net 还提供了众多的功能,软件过程中几乎80%工作都能通过它完成。虽然Spring.Net 功能众多,但是使用Spring.Net后对于我们的应用程序消耗来说却是微不足道的,它是非侵入式的(几乎所有的功能,可以通过配置文件来管理,而开发人员可以使用Spring.Net 中一个功能模块或者同时使用多个功能模块。在使用Spring.Net的功能模块中,可以只通过配置就能完成,并且不影响原有的开发方式),正是由于这种非侵入式,因此Spring.Net 框架才被称为面向企业级应用轻量级功能完善的开源框架。
1.2 之前我们如何软件开发
在企业级应用中一般都是很复杂的,不像我们以前在学校开发的XX管理系统那样。企业级应用中我们通常都使用 三层结构(多层结构)来将应用程序划分为若干个功能层。如数据访问层,业务逻辑层,表示层等等。例如:通常表示层需要调用业务逻辑层的方法,业务逻辑层需要调用数据访问层的方法,数据访问层需要访问数据库。不管应用程序如何构建,最终都是相互协作(各层之间的调用)的对象。这些对象一起组成了完整的应用程序(我们开发的软件)。所以我们一直说,软件中对象与对象之间具有相互依赖性。当软件复杂到一定程度的时候(企业级应用就很复杂了),如果软件架构的不好,各层之间依赖性太强,这个时候当需求发生变化的时候,我们就无法让我们的软件去适应这些变化,最终导致我们的软件流产。
微软.Net平台为构建软件提供了丰富的功能。从基元类型到基础类库,以及到功能完善的WinForm和Asp.Net 框架。但是可能是由于之前没有开源的原因,造成.Net社区一直没有发展壮大起来。而.Net平台本身并没有提供任何方式来管理业务逻辑并将他们以适当的方式组织起来的解决方案,以前只能是架构师或者开发人员去创建应用程序。可是在我们国家的确是人才有限,好的架构师不是每个团队都有。
诚然,目前有很多设计模式可用于业务领域的设计,我们使用这些设计模式可以将类或者对象比较好的组合起来构建我们的软件。如:工厂,抽象工厂,建造者,装饰者,以及代理模式等等,已经被现今的软件开发行业广泛接受和采用(这可能就是这些设计模式很早就被定型为模式的原因,在90年代Gof就出版了《设计模式:可复用面向对象软件的基础》一书),这些模式都很好,他们大部分都是定型的已命名的编程方式,这些模式一般都会说,在什么场合下使用,能解决什么问题。
1.3 Spring.Net 所解决的问题
Spring.Net 是一套业务逻辑层的框架,它在我们的软件开发中起着承上启下的作用(上有表示层,下有数据访问层)。在Spring.Net中大量使用了设计模式,如果我们在软件开发中合理规范的使用Spring.Net 框架,开发人员无需达到架构师的水平就能够比较好驾驭我们的应用程序,并且提高开发效率。
在Spring.Net的IOC(控制反转:稍后会和大家详细谈到)容器所解决的,正是如何在企业级应用中如何有效,合适的将类和对象以及服务组合成应用程序的问题。IOC容器通过正统(正统的意思是,这些方式都是经过业界多年考验,已经定型了为设计模式的最佳编程方式)的将分散的组件或者类以及对象组合成完整的应用程序。Spring.Net 将他们有效的整合起来。Spring.Net大大减少了各个层次之间的耦合,分离了关注点(我们以前关注数据访问方式,页面逻辑等等)让开发人员有更多的精力只关注于业务逻辑。它为我们创建出具有扩展性,维护性的软件提供了基础。
1.4 背景
在2004年初,Martin Fowler曾经问他网站的读者:当我们谈到控制反转时,“问题是,它们反转的是哪方面的控制?”。随后Fowler建议为控制反转重新命名(或者起码给它一个更具自我描述性的名字),所以依赖注入(Dependency Injection)这一术语才得以使用。Fowler在论文中也讨论了控制反转和依赖注入原理背后的一些概念。如果您需要了解正宗的IoC和DI理论,可以参考这篇论文:http://martinfowler.com/articles/injection.html。
1.5 控制反转 VS 依赖注入
控制反转(IOC) 和 依赖注入(DI) ,其实它们是同一个概念的不同角度的描述,由于控制反转概念比较模糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级别人物Martin Flower又给出了一个新名字:”依赖注入”,相对控制反转而言,“依赖注入”又 确描述了被注入对象依赖IOC容器配置以来对象。
以下会有专门的章节帮我们来理解什么是 控制反转 和 依赖注入。
1.6 Spring.Net 整体结构以及模块
(图1 Spring.Net框架的整体结构:该图出自Spring.Net 官方网站)
Spring.NET框架包括很多功能,这些功能被很好的组织进一系列模块当中,如下图所示。Spring.NET 1.0包括完整的IoC容器和AOP类库。1.1版将加入Web、ORM和数据模块。Spring.NET的下载包中并不包含与其它类库(如NHibernate,TIBCO EMS,Anthem,和IIOP.NET)集成的模块,如果需要您可以单独下载。上图为Spring.NET的各个核心模块。灰色阴影部分在1.0版中已经可用了,其它模块会在未来版本中陆续发布。目前可以从Spring.Net的官方网站上单独下载这些新的模块。
(1) Spring.Core:
作为整个框架的基础,实现了依赖注入的功能。Spring.NET的大部分模块都要依赖或扩展该模块。Spring.Core的基础是IObjectFactory接口,该接口用一个简单而优雅的方式实现了工厂模式,使我们可以无需自行编写singleton类型和众多的服务定位器,并允许将对象配置及其依赖关系与具体的程序逻辑解耦。该模块中的IApplicationContext接口是IObjectFactory的扩展,增加了诸多企业级功能,包括使用资源文件进行文本本地化、事件传播和资源装载等等。
(2) Spring.AOP:
为业务对象提供面向方面编程(AOP)的支持。AOP完善了IoC容器的功能,为创建企业应用和使用声明式服务奠定了坚实的基础。
(3) Spring.Web:
对ASP.NET进行了一系列功能扩展,包括对ASP.NET页面进行依赖注入、双向数据绑定、在ASP.NET 1.1中使用Master page、以及增强的本地化功能支持等。
(4) Spring.Services:
允许将任意的“普通”对象(意为没有继承任何指定基类型的对象)发布为企业服务(COM+)或远程对象。通过依赖注入和特性元数据覆盖等功能,该模块可使.NET的Web服务获得极大的灵活性。同时也支持Windows后台服务。
(5) Spring.Data:
定义了一个抽象的数据访问层,可以跨越各种数据访问技术(从ADO.NET到各种ORM)进行数据访问。该模块包含一个ADO.NET的抽象层,减少了使用传统ADO.NET进行编码和事务管理时的工作量。
(6) Spring.ORM:
为时下流行的ORM类库( 如:Nhibernate, Ibatis.Net等)提供了一个整合层,其中包含声明式事务管理等诸多功能。