Java-EE教程课件第十六章-Spring技术_第1页
Java-EE教程课件第十六章-Spring技术_第2页
Java-EE教程课件第十六章-Spring技术_第3页
Java-EE教程课件第十六章-Spring技术_第4页
Java-EE教程课件第十六章-Spring技术_第5页
已阅读5页,还剩35页未读, 继续免费阅读

下载本文档

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

文档简介

Spring技术第十六章Spring技术1)Spring概述2)Ioc技术3)

依赖注入4)配置文件5)用Spring整合其他JavaEE框架16.1Spring概述

Spring是一个开源框架,它由RodJohnson创建。发布于著名的开源项目网站SourceForge()Spring框架是一个轻量级的控制反转(IoC)技术和面向切面编程(AOP)技术的容器框架,利用Spring框架中的IoC技术可以实现JavaEE平台中所倡导的由容器实现对象的生命周期管理,而利用Spring框架中的AOP技术可以实现JavaEE平台中所倡导的分离应用系统中业务逻辑组件和通用的技术服务组件。Spring是为了解决企业应用开发的复杂性而创建的。以IoC(控制反转)和AOP(面向切面编程)两种技术为基础,较为完美地降低了企业级开发的复杂度,大大降低了开发基于Java企业级软件的开发成本。16.1Spring概述在Spring框架中为应用系统的开发者提供的是“对象管理”技术,也就是为开发者解决包括对象的生命周期、对象之间的依赖关系建立、对象的缓存实现等方面问题的管理技术。“对象管理”是每个面向对象编程的程序员都要面临的问题,将程序员从烦琐、单调和重复的编程工作中解脱出来,正是Spring框架的价值所在。1、轻量级框架

无论从框架的大小与使用开销两方面而言Spring都是轻量级的。Spring是非侵入式的。使用Spring时,完全不用继承和实现Spring的类和接口等。2、IoC容器

IoC(控制反转)是Spring的核心概念,Spring正是通过这种技术促进了对象之间的松耦合。3、AOP实现面向切面编程(AOP)是Spring的又一强大功能。AOP可以将程序的业务代码和系统服务代码(如事务管理、日志记录等)分离开,实现业务与非业务的分离。16.1.1Spring的特征4、容器

Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,JavaBean容器。5、框架Spring可以将简单的组件进行配置,组合成为复杂的应用。Spring也提供了很多基础功能,如事务管理、持久化框架集成等。6、其它企业级服务Spring还封装了一些企业级服务。这些企业服务包括:远程服务(Remoting)、电子邮件(E-mail)、JMS、JNDI、WebServices和任务调试等。16.1.1Spring的特征1、降低组件间的耦合度借助Spring,实现依赖注入、AOP应用和面向接口编程,可以降低业务组件之间的耦合度,增强系统的扩展性。2、AOP编程的支持通过Spring提供的AOP功能,方便进行面向切面的编程,许多不容易用传统OOP实现的功能可以通过AOP轻松应付,让程序员可以集中精力处理业务逻辑。3、方便集成各种优秀框架Spring不排斥各种优秀的开源框架,相反Spring可以降低各种框架的使用难度,Spring提供了对各种优秀框架(如Struts,Hibernate)等的直接支持。16.1.2Spring的优点16.1.3Spring的技术特征1、轻量:从大小与开销两方面而言Spring都是轻量的。此外,Spring是非侵入式的。使用Spring,我们的类还是pojo类,完全不用继承和实现Spring的类和接口等。也就是说,使用Spring的应用中的对象不依赖于Spring的特定类。2、IoC:Spring通过控制反转技术促进了松耦合。当应用了IoC,一个对象依赖的其它对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。不是我们自己控制对象从容器中查找依赖,而是容器在对象初始化时不等对象请求就主动将依赖传递给它,这就是DI——依赖注入。基本上就是对象不用自己动手管理和创建。完全由容器管理,我们只管用就行。

16.1.3Spring的技术特征3、AOP:Spring提供了面向切面的编程支持,AOP将与程序业务无关的内容分离提取,应用对象只实现它们应该做的——完成业务逻辑,仅此而已。它们并不负责其它的系统级关注点,例如日志或事务支持。AOP将与业务无关的逻辑横切进真正的逻辑中。4、容器:Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器,你可以配置你的每个bean如何被创建——基于一个可配置原型(prototype),你的bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。然而,Spring的容器也是轻量级的。

16.1.3Spring的技术特征5、框架:Spring可以将简单的组件配置、组合成为复杂的应用。在Spring中,应用对象被声明式地组合,典型地是在一个XML文件里。Spring也提供了很多基础功能(事务管理、持久化框架集成等等),而用户就有更多的时间和精力去开发应用逻辑。

所有Spring的这些特征都能帮助我们编写更干净、更可管理、并且更易于测试的代码。它们也为Spring中的各种模块提供了基础支持。

16.1.4Spring的组织结构采用分层架构,整个框架由7个定义良好的模块(组件)构成,它们都统一构建于核心容器之上,分层架构允许用户选择使用任意一个模块。1、核心模块

Core模块是Spring的核心容器,它实现了IoC模式,提供了Spring框架的基础功能。2、Context模块Context模块提供BeanFactory功能,并且添加了事件处理、国际化以及数据校验等功能,。3、AOP模块Spring集成了所有AOP功能。Spring提供了用标准Java语言编写的AOP框架,它的大部分内容都是基于AOP联盟的API开发的。4、DAO模块

DAO模块提供了JDBC的抽象层,并且提供了对声明式事务和编程式事务的支持。16.1.4Spring的组织结构5、ORM映射模块

SpringORM模块提供了对现有ORM框架的支持。6、Web模块

SpringWeb模块建立在SpringContext基础之上,它提供了Servlet监听器的Context和Web应用的上下文,对现有的Web框架(如JSF、Tapestry、Struts等)提供了集成。7、MVC模块

SpringWebMVC模块建立在Spring核心功能之上,这使它能拥有Spring框架的所有特性,能够适应多种多视图、模板技术、国际化和验证服务,实现控制逻辑和业务逻辑的清晰分离。16.1.4Spring的组织结构16.2IoC的基本概念IoC(InversionofControl,控制反转),是指应用程序中对象的创建、销毁等不再由程序本身编码实现,而是由外部的Spring容器在程序运行时根据需要注入到程序中。也就是对象的生命周期不是由程序本身决定,而是由容器来控制,所以称为控制反转。控制权的转移带来的好处就是降低了对象间的依赖关系。Spring框架是一个轻量级框架,通过IoC容器统一管理各组件之间的依赖关系来降低组件之间耦合的紧密程度。由此看来,IoC是整个Spring框架的核心16.2.1IoC实例1【例1】不同动物,移动方式不相同,有的跑(run),有的飞(fly)1、创建接口类MoveablepublicinterfaceMoveable{voidmove();}2、创建类org.Animal,实现Moveable接口publicclassAnimalimplementsMoveable{

//类Animal有2个属性privateStringanimalType;//何种动物privateStringmoveMode;//如何move

//animalType属性的setter函数publicvoidsetAnimalType(StringanimalType){this.animalType=animalType;}//moveMode属性的setter函数publicvoidsetMoveMode(StringmoveMode){this.moveMode=moveMode;}//move接口的实现publicvoidmove(){

StringmoveMessage=animalType+"can"+moveMode;System.out.println(moveMessage);}}16.2.1IoC实例13、添加Spring配置信息。<?xmlversion="1.0"encoding="UTF-8"?><beansxmlns="/schema/beans" xmlns:xsi=/2001/XMLSchema-instance xsi:schemaLocation="/schema/beans/schema/beans/spring-beans-2.5.xsd"> <beanid="animal"class=“org.Animal"> <propertyname="animalType"> <value>Bird</value> </property> <propertyname="moveMode"><value>fly</value></property> </bean></beans>16.2.1IoC实例14、创建测试类TestclassTest{publicstaticvoidmain(String[]args){//创建Spring容器

ApplicationContextctx=newClassPathXmlApplicationContext(“ApplicationContext.xml");//从容器中获取Animal类的实例

Moveableanimal=(Moveable)ctx.getBean("animal");//调用move方法

animal.move();//运行结果:Birdcanfly}}5、不改变测试类Test,只改变配置文件,实现业务逻辑更改修改moveMessage和moveMode的值:<beanid="animal"class="ioc.Animal"><propertyname="animalType"><value>Dog</value></property><propertyname="moveMode"><value>run</value></property></bean>再次运行程序,结果变为:Dogcanrun16.2.2对象的三种创建方式软件系统中,对象的创建方式分为三类:自己创建、工厂模式和外部注入,其中外部注入就是IoC模式。可以用三个形象的动词来分别表示这三个调用方法,即new、get和set,new表示对象由自己通过new创建,get表示从别人(即工厂)那里取得,set表示由别人推送进来(注入),其中get和set分别表示了主动去取和等待送来两种截然不同的方式。16.2.2Ioc实例2对实例1进行扩展,考虑Animal类,有时需要将moveMessage在屏幕中显示出来,有时又需要将它写入文件,在Animal类中引入MessagePrinter接口类,由它负责将信息输出到控制台或文件中。publicinterfaceMessagePrinter{voidprintMessage(StringMessage);}publicScreenPrinterimplementsMessagePrinter{voidprintMessage(StringMessage){System.out.println(Message+“on”+“Screen”).}publicFilePrinterimplementsMessagePrinter{voidprintMessage(StringMessage){System.out.println(Message+“on”+“File”).}方式1、new----自己创建(1)修改Animal类,增加一个MessagePrinter类型的依赖对象printer,由它决定信息如何输出。publicclassAnimalimplementsMoveable{//保持Moveable接口不变

…

privateMessagePrinterprinter;publicvoidmove(){StringmoveMessage=animalType+"can"+moveMode;printer.printMessage(moveMessage);}

publicvoidsetPrinter(MessagePrinterprinter){//注入printerthis.printer=printer;}}方式1、new----自己创建(2)创建测试类publicclassTestNew{publicstaticvoidmain(String[]args){MessagePrinterprinter=newScreenPrinter//创建屏幕输出类

Animalanimal=newAnimal();//创建Animal类();

animal.setAnimalType("Bird");animal.setMoveMode("fly");

animal.setPrinter(printer);

animal.move();}}输出:Birdcanfly如果需要将信息输出到文件中,则必须将:MessagePrinterprinter=newScreenPrinter();//创建屏幕输出类修改为:MessagePrinterprinter=newFilePrinter();//创建文件输出类这种方法的缺点:无法更换被调用者,除非修改源代码。方式2:get----工厂模式(1)创建PrinterFactory工厂类publicclassPrinterFactory{

//产生ScreenPrinterpublicstaticMessagePrintergetScreenPrinter(){MessagePrinterprinter=newScreenPrinter();returnprinter;}//产生FilePrinterpublicstaticMessagePrintergetFilePrinter(){MessagePrinterprinter=newFilePrinter();returnprinter;}}方式2:get----工厂模式(2)创建测试类TestGetpublicclassTestGet{publicstaticvoidmain(String[]args){//屏幕输出类

MessagePrinterprinter=PrinterFactory.getScreenPrinter();

Animalanimal=newAnimal();animal.setAnimalType("Bird");animal.setMoveMode("fly");animal.setPrinter(printer);animal.move();}}输出:BirdcanflyonScreen如果需要将信息输出到文件中,则必须修改代码为:MessagePrinterprinter=PrinterFactory.getFilePrinter();//文件输出类可以看出:Animal类依赖的MessagePrinter对象由工厂统一创建,使调用者无需关心对象的创建过程,只管从工厂中取得即可。这种方法实现了一定程度的优化,使得代码的逻辑趋于统一。缺点是对象的创建和替换依然不够灵活,完全取决于工厂,并且多了一道中间工序。方式3:set----外部注入显然方法1和方法2都有其缺陷,不够灵活,这里我们使用IoC。(1)设置配置文件ApplicationContext.xml<beanid="movePrinter"class=“zjc.ScreenPrinter"></bean><beanid="animal"class=“org.Animal"> <propertyname="printer"ref="movePrinter"/> <propertyname="animalType"> <value>Bird</value> </property> <propertyname="moveMode"> <value>fly</value> </property></bean>org.Animal类的对象共依赖三个对象,分别为printer、animalType和moveMode,它们的值分别通过相应的设值方法setPrinter()、setAnimalType()和setMoveMode()由IoC容器注入到对象中。方式3:set----外部注入(2)创建测试类TestIocclassTestIoc{publicstaticvoidmain(String[]args){//创建Spring容器

ApplicationContextctx=newClassPathXmlApplicationContext(“ApplicationContext.xml");//从容器中获取Animal类的实例

Moveableanimal=(Moveable)ctx.getBean("animal");//调用move方法

animal.move();}}输出:BirdcanflyonScreen(3)设置配置文件ApplicationContext.xml<beanid="movePrinter"class=“org.FilePrinter"></bean><beanid="animal"class=“org.Animal"> <propertyname="printer"ref="movePrinter"/> <propertyname="animalType"> <value>Bird</value> </property> <propertyname="moveMode"> <value>fly</value> </property></bean>需要输出到文件只要修改配置文件,用FilePrinter替换ScreenPrinter输出:BirdcanflyonScreen

在第三种方式中,我们没有修改源程序,而只是修改了配置文件ApplicationContext.xml的内容,就实现了信息输出从控制台到文件的切换.

也就是说,采用IoC我们不需要重新修改并编译具体的Java代码就实现了对程序功能的动态修改,实现了热插拔,提高了灵活性。

可见,这种方式可以完全抛开依赖的限制,由外部容器自由地注入,这就是IoC,将对象的创建和获取提到外部,由外部容器提供需要的组件。依赖注入(DI,DependencyInjection),是MartinFowler在他的经典文章《InversionofControlContainersandtheDependencyInjectionpattern》中为IoC另取的一个更形象的名字。依赖注入有2种方式,即setter方法注入(setterinjection)和构造方法注入(constructorinjection),这两者是应用Spring时较为常用的注入方式。16.3依赖注入在各种类型的依赖注入方式中,setter(设值)方法注入在实际开发中使用最为广泛,基于设值的依赖注入机制比较直观、自然。在上例中,Animal类中的animalType和moveMode属性的值,都是通过相应的设值方法setAnimalType()和setMoveMode(),将配置文件ApplicationContext.xml中指定的值(value部分)分别注入给这两个属性。Animal类中的printer属性的值,都是通过相应的设值方法setPrinter()将配置文件ApplicationContext.xml中指定的值(ref部分)注入给这个属性。16.3.1setter方法注入构造方法注入:依赖关系是通过类构造函数建立,容器通过调用类的构造方法,将其所需的参数值注入其中。1)修改构造函数,删除原有的3个属性的getter和setter函数

publicclassAnimal1implementsMoveable{//Moveable接口不变

privateStringanimalType;privateStringmoveMode;

privateMessagePrinterprinter;publicAnimal1(StringanimalType,StringmoveMode,MessagePrinterprinter){this.animalType=animalType;this.moveMode=moveMode;this.printer=printer;}}2)修改ApplicationContext.xml文件的内容,新增bean对象animal1,<bean>元素的内容如下:<beanid="animal1"class=“org.Animal1"><constructor-argindex="0"type="java.lang.String"value="Bird"/><constructor-argindex="1"type="java.lang.String"value="fly"/><constructor-argindex="2"type="zjc.MessagePrinter“ref="movePrinter”/></bean>16.3.2构造方法注入1、setter注入这种注入方式与传统的JavaBean写法很相似,程序员更容易理解和接受,通过setter方式设定依赖关系显得更加直观、自然。缺点:组件使用者或许会忘记组件注入需要的依赖关系,依赖可能会因setter方法的调用而被修改。2、构造注入优点:构造注入可以在构造器中决定依赖关系的注入顺序,优先依赖的优先注入。依赖关系只能在构造器中设定,则只有组件的创建者才能改变组件的依赖关系。对组件的调用者而言,组件内部的依赖关系完全透明,更符合高内聚的原则。缺点:对于复杂的依赖关系,如果采用构造注入,会导致构造器过于臃肿,难以阅读。16.3.3两种依赖注入方式的对比1.Spring通过ApplicationContext接口来实现对容器的加载。2.ApplicationContext的实现类有:(1)ClassPathXmlApplicationContext:从classpath下加载配置文件(2)FileSystemXmlApplicationContext:从文件系统中加载配置文件3.加载容器:我们可以通过任一实现类来将配置文件中定义的Bean加载到容器中。

(1)ApplicationContextctx=newClassPathXmlApplicationContext(“ApplicationContext.xml");或者

(2)ApplicationContextctx=newFileSystemXmlApplicationContext(“c:\\ApplicationContext.xml");4.获取实例://从容器中获取Animal类的实例:bean配置id为animal的对象Moveableanimal=(Moveable)ctx.getBean("animal");16.4配置文件1.Spring配置文件装载过程2.Spring的配置文件内容属性或子标签描述举例id代表JavaBean

的实例对象。在Bean实例化之后可以通过id来引用Bean的实例对象<beanid="animal"class=“org.Animal"/>name代表JavaBean的实例对象名。与id属性的意义基本相同。<beanname="animal"class=“org.Animal"/>classJavaBean的类名(全路径),它是<bean>标签必须指定的属性同上singleton是否使用单例(Singleton)模式。false,在每次调用容器的getBean()方法时,都会返回新的实例对象。默认true,那么在Spring容器的上下文中只维护此JavaBean的一个实例。<beanname="animal"class=“org.Animal"singleton="false"/>autowireSpring的JavaBean自动装配功能<property>可通过<value/>节点可指定属性值。BeanFactory将自动根据JavaBean对应的属性类型加以匹配。<propertyname="moveMode"><value>fly</value></property><constructor-arg>构造方法注入时确定构造参数。index指定参数顺序,type指定参数类型。<constructor-argindex="0"type="java.lang.String"value="fly"/><ref>指定了属性对BeanFactory中其他Bean的引用关系。<beanid="prt"class="org.FilePrinter"/><beanid="animal"class="org.Animal"><propertyname="printer"ref="prt"/></bean>16.5用Spring整合其他JavaEE框架16.5.1Spring与Struts2整合基本思路是:在已经开发好的Struts2项目中,添加Spring框架,把用户自己编写的Action模块交给Spring容器管理,如图所示。1.修改struts.xml中action节的class属性<packagename="default"extends="struts-default"><actionname

温馨提示

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

评论

0/150

提交评论