1、Spring.NET框架应用及优劣势探讨信息工程事业部袁洋 Spring.Net框架探讨内容目录第一部分简单的介绍Spring.NET第二部分为何要使用Spring.Net框架第三部分Spring.Net各功能的探讨简单的介绍Spring.NETnSpring.Net框架介绍框架介绍nSpring.Net模块介绍模块介绍第一部分Spring.NET框架简介Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为
2、基础,将Spring.Java的核心概念与思想移植到了.NET平台上。Spring.Net框架特点 轻量从大小与开销两方面而言Spring都是轻量的。完整的Spring框架可以在一个大小只有1MB多的DLL文件里发布。并且Spring所需的处理开销也是微不足道的。非侵入 在应用中,一般不需要引用spring包里的类。控制反转Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应用了IoC,某一接口的具体实现类的选择控制权从调用类中移除,转交给第三方裁决。面向切面Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务进行内聚性的开发。应用对象只实现它们应该做
3、的完成业务逻辑仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。Spring即是一个容器又是一个框架。容器Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个Object如何被创建,你的Object可以创建一个单独的实例或者每次需要时都生成一个新的实例以及它们是如何相互关联的。框架Spring提供了很多基础的与业务逻辑无关的功能,比如:事务管理、持久化框架集成等等,使用Spring框架,开发人员可以专注于业务逻辑开发,这个意义上讲它是一个框架。Spring.Net模块介绍Spring.NET框架包含了许多功能方面,各核心模块如图所示:Spri
4、ng.Net核心模块介绍Spring.Core作为整个框架的基础,实现了依赖注入的功能。Spring.NET的大部分模块都要依赖或扩展该模块。Spring.Core的基础是IObjectFactory接口,该接口用一个简单而优雅的方式实现了工厂模式,使我们可以无需自行编写singleton类型和众多的服务定位器,并允许将对象配置及其依赖关系与具体的程序逻辑解耦。该模块中的IApplicationContext接口是IObjectFactory的扩展,增加了诸多企业级功能,包括使用资源文件进行文本本地化、事件传播和资源装载等等。Spring.Net模块介绍 Spring.AOP为业务对象提供面向
5、方面编程(AOP)的支持。AOP完善了IoC容器的功能,为创建企业应用和使用声明式服务奠定了坚实的基础。Spring.Data定义了一个抽象的数据访问层,可以跨越各种数据访问技术(从ADO.NET到各种ORM)进行数据访问。该模块包含一个ADO.NET的抽象层,减少了使用传统ADO.NET进行编码和事务管理时的工作量。Spring.Data.NHibernate使用此模块集成到Spring的声明式事务管理功能NHibernate的能容易地操作ADO.NET和NHibernate的混合在同一事务。NHibernate的1.0用户将受益于易于使用的API来执行数据访问操作。Spring.Net模块
6、介绍 Spring.Web使用此模块,以抽象方式编写ASP.NET Web应用程序时允许你有效地解决共同的棘手问题,如在ASP.NET数据绑定,验证和ASP.NET母板页、控件、模块、驱动配置。Spring.Web.Extensions 使用此模块,可以轻松公开一个平原。NET对象(PONO),这是一个没有任何属性或特殊基类作为Web Service,通过依赖注入配置,应用AOP,并暴露在客户端的JavaScript。Spring.Services-使用此模块,以适应平原。使他们能够与特定的分布式通信技术等。NET Remoting的,企业服务,ASMX Web Service,和WCF服务,
7、使用NET对象。这些服务可以通过依赖注入配置和应用AOP。Spring.Net模块介绍 Spring.Testing.NUnit-使用此模块进行整合NUnit的测试。Spring.Messaging-使用此模块,以提您高效的创建Microsoft消息队列(MSMQ)应用程序坚实基础的最佳做法。Spring.Scheduling.Quartz-提供与Quartz.NET工作提供Quartz jobs,调度声明配置调度一体化,触发器以及一些方便的类以提高生产率在建立工作调度应用。为何要使用Spring.Net框架nIOC理论的背景及概念理论的背景及概念nIOC为我们带来了什么好处为我们带来了什么好
8、处nIOC容器的一些产品容器的一些产品n使用使用IOC框架应该注意什么框架应该注意什么第二部分IOC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。齿轮组中齿轮之间的啮合关系,与软件系统中对象之间的耦合关系非常相似。IOC理论的背景及概念伴随着工业级应用的规模越来越庞大,对象之间的依赖关系也越来越复杂,经常会出现对象之间的多重依赖性关系。架构师和设计师对于系统的分析和设计,将面临更大的挑战!对象之间耦合度过高的系统,必然会出现牵一发而动全身的情形!IOC理论的背景及概念如何降低系统之间、模块之间和对象
9、之间的耦合度,是软件工程永远追求的目标之一。为了解决对象之间的耦合度过高的问题,软件专家Michael Mattson提出了IOC理论,用来实现对象之间的“解耦”最热门的最热门的IOC框架技术框架技术Spring应运而生。应运而生。IOC理论的背景及概念 IOC是Inversion of Control(控制反转)的缩写。简单来说就是把复杂系统分解成相互合作的对象,这些对象类通过封装以后,内部实现对外部是透明的,从而降低了解决问题的复杂度,而且可以灵活地被重用和扩展。借助于“第三方”实现具有依赖关系的对象之间的解耦。全部对象的控制权全部上缴给“第三方”IOC容器!IOC理论的背景及概念 IOC
10、容器成了整个系统的关键核心,它起到了一种类似“粘合剂”的作用,把系统中的所有对象粘合在一起发挥作用,如果没有这个“粘合剂”,对象与对象之间会彼此失去联系,这就是有人把IOC容器比喻成“粘合剂”的由来。这时候,A、B、C、D这4个对象之间已经没有了耦合关系,彼此毫无联系,这样的话,当你在实现A的时候,根本无须再去考虑B、C和D了,对象之间的依赖关系已经降低到了最低程度。IOC理论的背景及概念 IOC的别名:依赖注入(DI)所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。依赖注入(DI)和控制反转(IOC)是从不同的角度的描述的同一件事情,就是指通过引入IOC容器,利
11、用依赖关系注入的方式,实现对象之间的解耦。IOC理论的背景及概念 对象A依赖于对象B,当对象 A需要用到对象B的时候,IOC容器就会立即创建一个对象B送给对象A。IOC容器就是一个对象制造工厂,你需要什么,它会给你送去,你直接使用就行了,而再也不用去关心你所用的东西是如何制成的,也不用关心最后是怎么被销毁的,这一切全部由IOC容器包办。当电脑主机读取文件的时候,我就把它所要依赖的外部设备,帮他挂接上。整个外部设备注入的过程和一个被依赖的对象在系统运行时被注入另外一个对象内部的过程完全一样。依赖注入(DI)IOC为我们带来了什么好处 第一、USB设备作为电脑主机的外部设备,在插入主机之前,与电脑
12、主机没有任何的关系,只有被我们连接在一起之后,两者才发生联系,具有相关性。第二、USB设备和电脑主机的之间无关性,还带来了另外一个好处,生产USB设备的厂商和生产电脑主机的厂商完全可以是互不相干的人,各干各事,他们之间唯一需要遵守的就是USB接口标准。以USB设备为例IOC为我们带来了什么好处 第三、同一个USB外部设备可以插接到任何支持USB的设备,可以插接到电脑主机,也可以插接到DV机,USB外部设备可以被反复利用。第四、同USB外部设备一样,模块具有热插拔特性。IOC容器的一些产品 Sun ONE技术体系下的IOC容器有:轻量级的有Spring、Guice、Pico Container、
13、Avalon、HiveMind;重量级的有EJB;不轻不重的有JBoss,Jdon等等。Spring框架作为Java开发中SSH(Struts、Spring、Hibernate)三剑客之一,大中小项目中都有使用,非常成熟,应用广泛,EJB在关键性的工业级项目中也被使用,比如某些电信业务。.Net技术体系下的IOC容器有:Spring.Net、Castle等等。Spring.Net是从Java的Spring移植过来的IOC容器,Castle的IOC容器就是Windsor部分。它们均是轻量级的框架,比较成熟,其中Spring.Net已经被逐渐应用于各种项目中。使用IOC框架应该注意什么 第一、软件
14、系统中由于引入了第三方IOC容器,生成对象的步骤变得有些复杂,本来是两者之间的事情,又凭空多出一道手续,所以,我们在刚开始使用IOC框架的时候,会感觉系统变得不太直观。所以,引入了一个全新的框架,就会增加团队成员学习和认识的培训成本,并且在以后的运行维护中,还得让新加入者具备同样的知识体系。第二、由于IOC容器生成对象是通过反射方式,在运行效率上有一定的损耗。如果你要追求运行效率的话,就必须对此进行权衡。使用IOC框架应该注意什么 第三、具体到IOC框架产品(比如:Spring)来讲,需要进行大量的配制工作,比较繁琐,对于一些小的项目而言,客观上也可能加大一些工作成本。第四、IOC框架产品本身
15、的成熟度需要进行评估,如果引入一个不成熟的IOC框架产品,那么会影响到整个项目,所以这也是一个隐性的风险。nIOC控制控制反转反转nAOP切面编程切面编程nTransaction事务事务管理管理第三部分Spring.Net各功能的探讨IOC控制反转 控制反转(Inversion of Control,英文缩写为IOC),也叫依赖注入(Dependency Injection)。我个人认为控制反转的意思是依赖对象(控制权)发生转变,由最初的类本身来管理依赖对象转变为IOC框架来管理这些对象,使得依赖脱离类本身的控制,从而实现松耦合。AOP切面编程 面向切面编程(也叫面向方面):Aspect Or
16、iented Programming(AOP),是目前软件开发中的一个热点,也是Spring框架中的一个重要内容。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。AOP切面编程 将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。可以通过预编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术。AOP实际是GOF设计模式的延续,设计模式孜孜不倦追求
17、的是调用者和被调用者之间的解耦,AOP可以说也是这种目标的一种实现。AOP切面编程我们编写程序时,首先思考要对程序中哪些方法进行拦截,拦截到这些方法后又要做哪些业务处理。这些关注过程,我们称之为:横切性关注点。由“横切性关注点”引申出以下概念:Aspect(切面):指横切性关注点的抽象即为切面,它与类相似,只是两者的关注点不一样,类是对物体特征的抽象,而切面是横切性关注点的抽象。程序里的切面就是AroundAdvise类的实现部分。joinpoint(连接点):所谓连接点是指那些被拦截到的点。在Spring.NET中,连接点指的是方法,因为Spring.NET只支持方法类型的连接点,实际上jo
18、inpoint(连接点)还可以是字段或类构造器。程序里的连接点就是拦截到的方法,如OrderService类的Save方法。AOP切面编程 Pointcut(切入点):所谓切入点是指我们要对那些joinpoint(连接点)进行拦截的定义。程序里没有使用invocation.Method来判断拦截哪些方式,而Pointcut(切入点)就是对所有方法进行拦截。Advice(通知):所谓通知是指拦截到joinpoint(连接点)之后所要做的事情就是通知.通知分为前置通知,后置通知,异常通知,环绕通知。AroundAdvise继承AopAlliance.Intercept.IMethodInterce
19、ptor 接口,程序里使用的是环绕通知。Target(目标对象):代理的目标对象。程序里的目标对象就是OrderService类,我们通过ProxyFactory factory=new ProxyFactory(new OrderService()UserName=admin);这句代码确定了目标对象是OrderService。AOP切面编程 AOP代理(AOP proxy):由AOP框架在将通知应用于目标对象后创建的对象。程序里通过GetProxy()方法创建出的代理对象。Weave(织入):指将切面(aspect)应用到目标对象(target)对象并导致代理(proxy)对象创建的过程称
20、为织入。正如程序里所应用的,OrderService类不具备判断权限的功能,我们将判断权限的功能SecurityService类的IsPass方法应用到目标对象的过程。Introduction(引入):在不修改类代码的前提下,Introduction(引入):可以在运行期为类动态地添加一些方法或字段。程序里在没有修改OrderService类,而是在运行期把判断权限的功能通过ProxyFactory的AddAdvice方法动态的增加进去。AOP切面编程Spring.NET的四种通知类型:一、拦截环绕通知(around advice):Spring.NET中最基本的通知类型是拦截环绕通知(int
21、erception around advice),即方法拦截器。拦截环绕通知继承IMethodInterceptor接口。注意其中IMethodInvocation.Proceed()方法的调用。该方法会依次调用拦截器链上的其它拦截器。大部分拦截器都需要调用这个方法并返回它的返回值。当然,也可以不调用Proceed方法,而返回一个其它值或抛出一个异常,但一般不太会这么做。二、前置通知(before advise):是在IMethodInterceptor.Proceed()方法调用前的通知。继承自IMethodBeforeAdvice接口。AOP切面编程 三、异常通知(throws advis
22、e):是在IMethodInterceptor.Proceed()方法调用时发生异常的通知。继承自IthrowsAdvice接口。IthrowsAdvice接口没有定义任何方法:它是一个标识接口(按:之所以用标识接口,原因有二:1、在通知方法中,只有最后一个参数是必须的。如果声明为接口的方法,参数列表就被固定了。2、如果第一个原因可以用重载的接口方法解决,那么这个原因就是使用标识接口的充分原因了:实现此接口的类必须声明一或多个通知方法,接口方法做不到这一点),用以表明实现它的类声明了一或多个强类型的异常通知方法。四、后置通知(after returning advise):是在IMethodI
23、nterceptor.Proceed()方法调用后的通知。继承自IAfterReturningAdvice接口。后置通知对切入点的执行没有影响,如果通知抛出异常,就会沿拦截器链向上抛出,从而中断拦截器链的继续执行。事务管理在Spring.NET中,提供了以下实现类:AdoPlatformTransactionManager-基于本地ADO.NET的事务。ServiceDomainPlatformTransactionManager-由企业服务提供的分布式事务管理器。TxScopePlatformTransactionManager-由System.Transactions提供的本地/分布式的事
24、务管理器。事务管理ITransactionDefinition接口封装了以下信息:Isolation:该事务对其它事务操作的隔离级别。例如,用来表示某个事务是否能看到其它事务写入的、但尚未提交的信息。Propagation:一般情况下,TransactionScope内的代码都会在为其指定的事务中运行。但是,该属性可用来设置如果某个事务环境已经存在时,该事务内的方法是否要执行:比如说,是简单的让它在现有事务中继续运行呢(这是一般情况),还是挂起现有事务然后创建一个新事务来运行。Timeout:在超时(并且被事务基础框架自动回滚之前)前该事务可以运行多久。Read-only状态:只读的事务不会修改任何数据。在某些情况下(比如使用NHibernate时),只读事务能显著提高性能。谢 谢!