Spring企业应用开发.ppt_第1页
Spring企业应用开发.ppt_第2页
Spring企业应用开发.ppt_第3页
Spring企业应用开发.ppt_第4页
Spring企业应用开发.ppt_第5页
已阅读5页,还剩33页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

Spring企业应用开发,Spring简介,本节课程目标,简介Spring框架J2EE架构的介绍Spring和EJB的比较?控制反转(InversionofControl)概念介绍依赖注入(DependencyInjection)概念介绍,Spring框架概述,Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的InversionofControl容器。然而,这仅仅是完整图景中的一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。Spring提供了唯一的数据访问抽象,包括简单和有效率的JDBC框架,极大的改进了效率并且减少了可能的错误。Spring的数据访问架构还集成了Hibernate和其他O/Rmapping解决方案。,Spring框架概述,Spring还提供了唯一的事务管理抽象,它能够在各种底层事务管理技术,例如JTA或者JDBC事务提供一个一致的编程模型。Spring提供了一个用标准Java语言编写的AOP框架,它给POJOs提供了声明式的事务管理和其他企业事务-如果你需要-还能实现你自己的aspects。这个框架足够强大,使得应用程序能够抛开EJB的复杂性,同时享受着和传统EJB相关的关键服务。Spring还提供了可以和IoC容器集成的强大而灵活的MVCWeb框架。,简介Spring框架-什么是Spring框架?,Spring的核心是个轻量级(Lightweight)容器(Container),实现了IoC(InversionofControl)模式的容器,基于此核心容器所建立的应用程序,可以达到程序组件的松散耦合(Loosecoupling),让程序组件可以进行测试(Testability),这些特性都使得整个应用程序可以在架构上与维护上都能得到相当程度的简化。,图解,Core封装包是框架的最基础部分,提供IoC和依赖注入特性。这里的基础概念是BeanFactory,它提供对Factory模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。构建于Core封装包基础上的Context封装包,提供了一种框架式的对象访问方法,有些象JNDI注册器。Context封装包的特性得自于Beans封装包,并添加了对国际化(I18N)的支持(例如资源绑定),事件传播,资源装载的方式和Context的透明创建,比如说通过Servlet容器。,图解2,DAO提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码。并且,JDBC封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的POJOs(plainoldJavaobjects)都适用。ORM封装包提供了常用的“对象/关系”映射APIs的集成层。其中包括JPA、JDO、Hibernate和iBatis。利用ORM封装包,可以混合使用所有Spring提供的特性进行“对象/关系”映射,如前边提到简单声明性事务管理。,图解3,Spring的AOP封装包提供了符合AOPAlliance规范的面向方面的编程(aspect-orientedprogramming)实现,让你可以定义,例如方法拦截器(method-interceptors)和切点(pointcuts),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种行为信息合并到你的代码中,这有点象.Net的attribute的概念。Spring中的Web包提供了基础的针对Web开发的集成特性,例如多方文件上传,利用Servletlisteners进行IoC容器初始化和针对Web的applicationcontext。当与WebWork或Struts一起使用Spring时,这个包使Spring可与其他框架结合。Spring中的MVC封装包提供了Web应用的Model-View-Controller(MVC)实现。Spring的MVC框架并不是仅仅提供一种传统的实现,它提供了一种清晰的分离模型,在领域模型代码和webform之间。并且,还可以借助Spring框架的其他特性。,简介Spring框架-什么是Spring框架?,轻量级(Lightweight)Spring的核心在档案容量上只有不到1MB的大小,而使用Spring核心所需要的资源也是很小的,而Spring是个非侵入性(Nonintrusive)框架,它的目的之一,是让应用程序不感受到框架的存在,减低应用程序从框架移植时的负担。容器(Container)Spring核心本身是个容器,管理对象的生命周期、对象的组态、依赖式注入等,并可以控制对象在创建时是以原型(Prototype)或单例(Singleton)的方式来建立。,简介Spring框架-什么是Spring框架?,IoC(InversionofControl)Spring的核心概念是IoC,更具体而易懂的名词是依赖注入(DependencyInjection),使用Spring,您不必自己在程序代码中维护对象的依赖关系,只需在组态档中加以设定,Spring核心容器会自动根据组态将依赖注入指定的对象。除了这些特性之外,Spring的目标是实现一个全方位的整合框架,在Spring框架下实现多个子框架的组合,这些子框架之间彼此可以独立,也可以使用其它的框架方案加以替代,Spring希望提供one-stopshop的框架整合方案。,简介Spring框架-什么是Spring框架?,AOP框架Spring最为人重视的另一方面是支持AOP(Aspect-orientedprogramming),然而AOP框架只是Spring支持的一个子框架,说Spring框架是AOP框架并不是一件适当的描述,人们对于新奇的AOP关注映射至Spring上,使得人们对于Spring的关注集中在它的AOP框架上,虽然有所误解,但也突显了Spring的另一个令人关注的特色。,简介Spring框架-什么是Spring框架?,持久层Spring提供对持久层的整合,如JDBC、O/RMapping工具(Hibernate、iBATIS)、事务处理等。Web框架Spring也提供Web框架的解决方案,但您也可以将自己所熟悉的Web框架与Spring整合,像是Struts、Webwork等,都可以与Spring整合而成为适用于自己的解决方案。对于一些服务,例如JNDI、Mail、排程、远程等,Spring不直接提供实作,而是采取抽象层方式进行包装,让这些服务在使用时可以有一致的使用模式且更为方便,什么是J2EE?,什么是J2EE,是业界标准有超过50家厂商实现了这些标准(工具,应用服务器)是各个厂商间协同工作的结果J2EE平台包括:共同认可的规范参考实现(ReferenceImplementation)测试套件(TestSuite)J2EE蓝本(Blueprints):设计指南基于Java技术Java运行时环境(JRE)解释执行中间字节码(bytecode),J2EE架构的介绍,介绍J2EE的三层架构展现层-可以Struts框架持久化层-可以用Hibernate业务逻辑层-可以Spring注意:集成各种框架时,一定要注意各自的配置文件是怎么样的关系。Web.xmlstruts-config.xmlhibernate-config.xmlapplicationContext.xml,Spring和EJB比较?,Spring和EJB是什么关系Spring核心是依赖注入模式,它可以单机、或与现有应用服务器一起工作,使用了大量的XML配置EJB3.0是一个标准框架,它使用了大量的Java标注。Spring可以随时测试,而EJB测试非常麻烦预留作业:大家下去请寻找两者对比的详细资料,以便理解两者区别。,控制反转InversionofControl,Spring的核心概念是IoC,IoC的抽象概念是依赖关系的转移,像是高层模块不应该依赖低层模块,而是模块都必须依赖于抽象是IoC的一种表现,实现必须依赖抽象,而不是抽象依赖实现也是IoC的一种表现,应用程序不应依赖于容器,而是容器服务于应用程序也是IoC的一种表现。IoC全名InversionofControl,如果中文硬要翻译过来的话,就是控制反转。初看IoC,从字面上不容易了解其意义,我觉得要了解IoC,要先从DependencyInversion开始了解,也就是依赖关系的反转。理解核心:IoC就是将依赖关系进行了反转,要理解IoC,得先理解依赖关系,什么是依赖关系呢?,控制反转InversionofControl,简单的说,在模块设计时,高层的抽象模块通常是与业务相关的模块,它应该具有重用性,而不依赖于低层的实作模块,例如如果低层模块原先是软盘存取模式,而高层模块是个存盘备份的需求,如果高层模块直接调用低层模块的函数,则就对低层模块产生了依赖关系。,控制反转InversionofControl,举个例子,例如下面这个程序:publicclassCapterTest.voidsave().saveToFloppy();由于save()程序依赖于依赖于saveToFloppy(),如果今天要更换低层的存储模块为Usb盘,则这个程序没有办法重用,必须加以修改才行,低层模块的更动造成了高层模块也必须跟着更动,这不是一个好的设计方式,在设计上希望模块都依赖于模块的抽象,这样才可以重用高层的业务设计。,控制反转InversionofControl,如果以对象导向的方式来设计,依赖反转(DependencyInversion)的解释变为程序不应依赖实现,而是依赖于抽象,实现必须依赖于抽象。来看看下面这个Java程序:publicclassBusinessObjectprivateFloppyWriterwriter=newFloppyWriter();.publicvoidsave().writer.saveToFloppy();,控制反转InversionofControl,在这个程序中,BusinessObject的存盘依赖于实际的FloppyWriter,如果今天想要将存盘改为存至Usb盘,则必须修改或继承BusinessObject进行扩展,而无法直接使用BusinessObject。如果通过接口的宣告,可以改进此一情况,例如:publicinterfaceIDeviceWriterpublicvoidsaveToDevice();publicclassBusinessObjectprivateIDeviceWriterwriter;publicvoidsetDeviceWriter(IDeviceWriterwriter)this.writer=writer;publicvoidsave().writer.saveToDevice();注意:红色部分是接口类型,而不是类,控制反转InversionofControl,这样一来,BusinessObject就是可重用的,如果今天有存储至Floppy或Usb盘的需求,只要实现IDeviceWriter即可,而不用修改BusinessObject:publicclassFloppyWriterimplementIDeviceWriterpublicvoidsaveToDevice()./实际储存至Floppy的程序代码publicclassUsbDiskWriterimplementIDeviceWriterpublicvoidsaveToDevice()./实际储存至UsbDisk的程序代码从这个角度来看,DependencyInversion的意思即是程序不依赖于实现,而是程序与实现都要依赖于抽象。,控制反转InversionofControl,IoC的Control是控制的意思,其实其背后的意义也是一种依赖关系的转移,如果A依赖于B,其意义即是B拥有控制权,您想要转移这种关系,所以依赖关系的反转即是控制关系的反转,藉由控制关系的转移,可以获得组件的可重用性,在上面的Java程序中,整个控制权从实际的FloppyWriter转移至抽象的IDeviceWriter接口上,使得BusinessObject、FloppyWriter、UsbDiskWriter这几个实现依赖于抽象的IDeviceWriter接口。,控制反转InversionofControl,程序的业务逻辑部份应是可以重用的,不应受到所使用框架或容器的影响,因为可能转移整个业务逻辑至其它的框架或容器,如果业务逻辑过于依赖容器,则转移至其它的框架或容器时,就会发生困难。IoC在容器的角度,可以用这么一句好莱坞名言来代表:“Dontcallme,Illcallyou.”以程序的术语来说的话,就是不要向容器要求您所需要的(对象)资源,容器会自动将这些对象给您!。IoC要求的是容器不侵入应用程序本身,应用程序本身提供好接口,容器可以通过这些接口将所需的资源注至至程序中,应用程序不向容器主动要求资源,故而不会依赖于容器的组件,应用程序本身不会意识到正被容器使用,可以随时从容器中脱离转移而不用作任何的修改,而这个特性正是一些业务逻辑中间件最需要的。,依赖注入DependencyInjection,IoC模式基本上是一个高层的概念,在MartinFowler的InversionofControlContainersandtheDependencyInjectionpattern中谈到,实现IoC有两种方式:依赖注入DependencyInjectionServiceLocator,Spring所采用的是DependencyInjection来实现IoC,中文翻译为依赖注入,依赖注入的意义是:保留抽象接口,让组件依赖于抽象接口,当组件要与其它实际的对象发生依赖关系时,借助抽象接口来注入依赖的实际对象。,依赖注入DependencyInjection,看看下面这个程序:publicclassBusinessObjectprivateFloppyWriterwriter=newFloppyWriter();.publicvoidsave().writer.saveToFloppy();,依赖注入DependencyInjection属性注入,BusinessObject依赖于实际的FloppyWriter,为了让BusinessObject获得重用性,不让BusinessObject直接依赖于实际的FloppyWriter,而是依赖于抽象的接口:publicinterfaceIDeviceWriterpublicvoidsaveToDevice();publicclassBusinessObjectprivateIDeviceWriterwriter;publicvoidsetDeviceWriter(IDeviceWriterwriter)this.writer=writer;publicvoidsave().writer.saveToDevice();,依赖注入DependencyInjection,publicclassFloppyWriterimplementIDeviceWriterpublicvoidsaveToDevice()./实际储存至Floppy的程序代码publicclassUsbDiskWriterimplementIDeviceWriterpublicvoidsaveToDevice()./实际储存至UsbDisk的程序代码,依赖注入DependencyInjection,如果今天BusinessObject想要与UseDiskWriter对象发生依赖关系,可以这么建立:businessObject.setDeviceWriter(newUsbDiskWriter();由于BusinessObject依赖于抽象接口,在需要建立依赖关系时,可以通过抽象接口注入依赖的实际对象。,依赖注入有几种实现方式?,依赖注入在MartinFowler的文章中谈到了三种实现方式:Interfaceinjection-接口注入Setterinjection-属性注入Constructorinjection-构造函数注入并分别称其为:Type1IoCType2IoCType3IoC,依赖注入DependencyInjection构造函数注入,上面的BusinessObject所实现的是Type2IoC,通过Setter注入依赖关系,而Type3IoC,则在是构造函数上注入依赖关系,例如:publicclassBusinessObjectprivateIDeviceWriterwriter;publicBusinessObject(IDeviceWriterwriter)this.writer=writer;publicvoidsave().writer.saveToDevice();,依赖注入DependencyInjection,Spring鼓励的是Setterinjection,但也允许您使用Constructorinjection,使用Setter或Constructor来注入依赖关系视您的需求而定,使用Constructor的好处之一是,您可以在构造对象的同时一并完成依赖关系的建立,然而如果要建立的对象关系很多,则会在构造式上留下一长串的参数,这时使用Setter会是个不错的选择,另一方面,Setter可以有明确的名称可以了解注入的对象会是什么,像是setXXX()这样的名称会比记忆Constructor上某个参数位置代表某个对象来得好。,依赖注入DependencyInjection接口注入,Type1IoC是Interfaceinjection,使用Type1IoC时会要求实现接口,这个接口是为容器所用的,容器知道接口上所规定的方法,它可以调用实例接口的对象来完成依赖关系的注入,例如:publicinterfaceIDependencyInjectionpublicvoidcreateDependency(MapdependObjects);publicclassBusinessObjectimplementIDependencyInjectionprivateMapdependObjects;publicvoidcreateDependency(MapdependObjects)this.dependObject=dependObjects;/在这边实现与BusinessObject的依赖关系.publicvoidsave().writer.s

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论