270 likes | 836 Views
Spring. net 基础及应用. 数据事业部 – 陈卫钢. 2012-3-6. 深圳市国泰安信息技术有限公司. Agenda. Why Spring.net. Spring.net 基本介绍. Spring.net 应用 – IoC/DI. Spring.net 应用 – AOP. Spring.net 应用 – WCF. Spring.net 应用 – Transaction. Spring.net 应用 – Cache. Spring.net 应用 – 其他. 参考资料. Q&A. Why Spring.net.
E N D
Spring.net基础及应用 数据事业部 – 陈卫钢 2012-3-6 深圳市国泰安信息技术有限公司
Agenda Why Spring.net Spring.net 基本介绍 Spring.net 应用 – IoC/DI Spring.net 应用 – AOP Spring.net 应用 – WCF Spring.net 应用 – Transaction Spring.net 应用 – Cache Spring.net 应用 – 其他 参考资料 Q&A
Why Spring.net • “非侵入式应用”,对现有系统代码改动小 • “非all-or-nothing解决方案”,可以只应用其中一部分功能,减少代码量,提高开发效率 • 全面支持以配置的方式提供服务,使得应用系统更灵活,更强大 • 面向接口编程,系统高度解耦 • 面向切面编程,功能模块化,代码复用更简单 • 涵盖企业应用开发80%以上需求 • 支持Microsoft Visual Studio的各个版本
Spring.net基本介绍 Spring.NET可以为很多领域的企业级应用开发提供“一站式服务”
Spring.net 应用 – IoC/DI 核心是解耦 例:MovieLister,MovieFinderImpl 耦合:在MovieLister中直接创建MovieFinderImpl的实例, MovieLister完全依赖MovieFinderImpl IoC/DI:通过容器(Container)创建MovieFinderImpl的实例,并注入(Injection)到MovieLister中, MovieLister不需依赖MovieFinderImpl IoC/DI
应用程序类 配置(元数据) Spring.Net轻量级 容器 产出 为用户提供完全可配置的系统 Spring.net 应用 – IoC/DI 3大核心接口 IObjectFactory:容器接口 IApplicationContext :继承自IObjectFactory,提供了管理和操作对象的更多功能 IObjectDefinition:注入对象的定义接口,供IObjectFactory/IApplicationContext调用 Spring.net IoC/DI 是Spring.net最核心的部分,其他应用都以此为基础
Spring.net 应用 – IoC/DI 注入的方式 构造器注入 属性注入 静态工厂方法注入 实例工厂方法注入
Spring.net 应用 – IoC/DI 容器里对象的生命周期 Singleton 和Prototype 两种模式 Singleton模式的对象生命周期由容器进行管理,默认为此模式 Prototype模式的对象生命周期由对象使用者进行管理
Spring.net 应用 – IoC/DI 典型配置文件: <configSections> <sectionGroup name="spring"> <section name="context" type="Spring.Context.Support.ContextHandler, Spring.Core"/> <section name="objects" type="Spring.Context.Support.DefaultSectionHandler, Spring.Core" /> </sectionGroup> </configSections> <spring> <context> <resource uri="config://spring/objects"/> </context> <objects xmlns="http://www.springframework.net"> <object name="MyMovieLister" type="TestSpring.MovieLister, TestSpring"> <property name="movieFinder" ref="MyMovieFinder"/> </object> <object name="MyMovieFinder" type="TestSpring.SimpleMovieFinder, TestSpring"/> </objects> </spring>
Spring.net 应用 – AOP AOP基本概念 AOP把程序分解为一系列方面(aspects)或者关注点(concerns)。 • 方面(Aspect):对横向分布在多个对象中的关注点所做的模块化。例如:事务管理 • 连接点(Joinpoint):程序执行过程中的一个点,例如对某个方法的调用 • 通知(Advice):AOP框架在某个连接点所采取的行为 • 切入点(Pointcut):指通知的应用条件,用于确定某个通知要被应用到哪些连接点上。 • 引入(Introduction):向目标对象添加方法或字段的行为。Spring.NET允许为任何目标对象引入新的接口。 • 目标对象(Target object):指包含连接点的对象。也称为被通知或被代理对象。 • AOP代理(AOP proxy):由AOP框架在将通知应用于目标对象后创建的对象。在Spring.NET中,AOP代理是使用IL代码在运行时创建的动态代理。 • 织入(Weaving):将方面进行组装,以创建一个目标对象。
Spring.net 应用 – AOP 各种通知 • 环绕通知(Around Advise):包围(按:即在连接点执行的前、后执行)某个连接点(如方法调用)的通知 • 前置通知(Before Advise):在某个连接点执行之前执行,但是不具备阻止连接点继续执行的能力(除非它抛出异常)。 • 异常通知(Throws Advise):当方法(连接点)抛出异常时执行。 • 后置通知(After returning Advise):在连接点正常执行完成后执行 • 自定义通知:可编程实现自定义通知
Aspect1, Aspect2, … 配置(元数据) Spring.Net AOP框架 业务系统 产出 为用户提供完整功能的系统 Spring.net 应用 – AOP 应用 • 事务管理 • 权限验证 • 日志记录 • 缓存管理 • … … Demo
Spring.net 应用 – WCF • 通过配置自动Host Wcf服务 • 客户端通过配置自动创建Wcf服务代理 • 可组合使用AOP框架 Demo
Spring.net 应用 – Transaction .net 事务管理API有哪几种?
Spring.net 应用 – Transaction Spring.NET用一个统一的抽象层来进行事务管理,其优点如下: • 为不同的事务API,包括ADO.NET、企业服务、System.Transactoins和NHibernate,提供统一的编程模型 • 能够在上述任一种数据访问技术中使用声明式事务管理 • 为编程方式的事务管理提供了一套易用的API
Spring.net 应用 – Transaction Spring.net 事务管理的实质还是AOP框架的应用:
Spring.net 应用 – Transaction 规定了7种类型的事务传播行为,它们规定了事务方法和事务方法发生嵌套调用时事务如何进行传播:
Spring.net 应用 – Transaction 应用代码片断(声明式事务管理) [Transaction(TransactionPropagation.Required)] public void DoTransfer(float creditAmount, float debitAmount) { accountCreditDao.CreateCredit(creditAmount); accountDebitDao.DebitAccount(debitAmount); } <objects xmlns="http://www.springframework.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:tx="http://www.springframework.net/tx" xmlns:db=http://www.springframework.net/database> <db:provider id="DbProvider" provider="SqlServer-1.1" connectionString="Data Source=(local);Database=Spring;User ID=springqa;Password=springqa;Trusted_Connection=False"/> <object id="transactionManager" type="Spring.Data.Core.AdoPlatformTransactionManager, Spring.Data"> <property name="DbProvider" ref="DbProvider"/> </object> <tx:attribute-driven transaction-manager="transactionManager"/> </objects>
Spring.net 应用 – Transaction 应用代码片断(编程方式) TransactionTemplate tt = new TransactionTemplate(TransactionManager); string userId = "Stewie"; object result = tt.Execute(delegate { dao.UpdateOperation(userId); return dao.UpdateOperation2(); });
Spring.net 应用 – Transaction 通过IoC/DI使用事务管理 <object id="sharedTransactionTemplate" type="Spring.Transaction.Support.TransactionTemplate, Spring.Data"> <property name="TransactionIsolationLevel" value="IsolationLevel.ReadUncommitted"/> <property name="TransactionTimeout" value="30"/> </object>
内置两类Cache实现:Spring.Caching.AspNetCache:使用Asp.net缓存来存储Spring.Caching.NonExpiringCache:用内存记录,无过期可扩展自己的Cache实现:实现接口Spring.Caching.Icache即可,第三方缓存管理如memcached可实现此接口来让Spring.net统一管理内置两类Cache实现:Spring.Caching.AspNetCache:使用Asp.net缓存来存储Spring.Caching.NonExpiringCache:用内存记录,无过期可扩展自己的Cache实现:实现接口Spring.Caching.Icache即可,第三方缓存管理如memcached可实现此接口来让Spring.net统一管理 Spring.net 应用 – Cache 可使用Spring Expression Language (SpEL) 来生成缓存的key
Spring.net 应用 – Cache 代码片断 [CacheResult("AspNetCache", "'Airport.Id=' + #id", TimeToLive = "0:1:0")] public Airport GetAirport(long id) { // implementation not shown... } 配置 <object" id="CacheAspect" type="Spring.Aspects.Cache.CacheAspect, Spring.Aop"/> <object id="AspNetCache" type="Spring.Caching.AspNetCache, Spring.Web”/> <object type="Spring.Aop.Framework.AutoProxy.ObjectNameAutoProxyCreator, Spring.Aop"> <property name="ObjectNames"> <list> <value>*Dao</value> </list> </property> <property name="InterceptorNames"> <list> <value>CacheAspect</value> </list> </property> </object>
Spring.net 应用 – 其他 • 结合Nhibernate进行数据访问 • 帮助更好使用MSMQ进行数据通信 • 结合Log4Net进行日志记录 • 辅助进行Asp.net MVC 2/3 开发,提升开发效率 • 结合Quartz.NET进行调度系统开发 • 帮助更好的实现本地化 • 集成Asp.net AJAX,方便通过JavaScript调用web服务 • … … 核心还是 IoC/DI
参考资料 Spring.net官网: http://www.springframework.net Spring.Net用户参考手册