《Spring框架概述.ppt》由会员分享,可在线阅读,更多相关《Spring框架概述.ppt(45页珍藏版)》请在三一办公上搜索。
1、软件学院,主讲教师:张国平,第 1章 Spring框架概述,软件学院,教学环节,课时分配:理论课:72课时实验课:34课时考试性质:考试(待定)成绩评定:考试成绩:平时成绩(包括:出勤、作业、实验情况、学习态度)*30%+期末考试成绩*70%,软件学院,参考书,1罗时飞,精通Spring,电子工业出版社,2005年。2 黄睿,Spring深度整合指南,电子工业出版社,2007年。,软件学院,学习目标,理解框架的含义理解引入框架技术的好处理解为什么要进行框架开发了解常见的Java框架了解Spring框架的历史了解Spring框架的优点了解什么是控制反转(IOC)开发工具和相应jar包的选择能够快
2、速利用Spring开发一个小应用程序,软件学院,教学重难点,重点框架的含义框架开发的必要性Spring框架的优点控制反转的含义利用Spring开发一个小应用程序难点控制反转的含义利用Spring开发一个小应用程序,软件学院,回顾,一、什么是框架 框架,即framework,其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统,简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。框架的概念最早起源于Smalltalk环境,其中最著名的框架是Smalltalk 80的用户界面框架MVC,随着用户界面框架Interviews和ET+的开发和发布,框架研究越来
3、越受研究人员的重视,虽然框架研究,软件学院,最初起源于用户界面领域,但它还被成功地应用到其它领域中,如操作系统(Russo 90)等。框架目前还没有统一的定义,其中Ralph Johnson所给出的定义基本上为大多数研究员所接受:一个框架是一个可复用设计,它是由一组抽象类及其实例间协作关系来表达的。所以说,框架着重于设计复用。,软件学院,二、为什么要用框架?因为软件系统发展到今天已经很复杂了,特别是服务器端软件,设计到的知识,内容,问题太多。在某些方面使用别人成熟的框架,就相当于让别人帮你完成一些基础工作,你只需要集中精力完成系统的业务逻辑设计。而且框架一般是成熟,稳健的,它可以处理系统很多细
4、节问题,比如,事务处理,安全性,数据流控制等问题。另外,框架一般都经过很多人使用,所以结构很好,扩展性也很好,而且它是不断升级的,可以直接享受别人升级代码带来的好处。,软件学院,框架一般处在低层应用平台(如J2EE)和高层业务逻辑之间的中间层。软件为什么要分层?为了实现“高内聚,低耦合”。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。,软件学院,三、为什么要进行框架开发 框架最大的好处就是重用。面向对象系统获得的最大的复用方式就是框架,一个大的应用系统往往可能由多层互相协作的框架组成。由于框架能重用代码,因此从一已有的构件库中建立应用变得非常容易,因为构件都采用框架统一的接口,从而
5、使构件间的通信简单。采用框架技术开发的主要特点包括:1、建立更加开放的系统 2、重用代码大大增加,软件学院,3、软件生产效率和质量得到了提高4、软件设计人员专注对领域的了解,使需求分析更充分5、存储了经验,允许经验丰富的人员去设计框架,而不必限于低层编程6、允许采用快速原型技术7、有利于在一个项目内多人协同工作,软件学院,四、常见的Java框架1、WAF(Web Application FrameWork):主要应用方面:EJB层,WEB层也有,但比较弱2、Struts:主要应用方面:WEB层3、COCOON:主要应用方面:WEB层4、ECHO:主要应用方面:WEB层5、JATO:主要应用方面
6、:WEB层6、TCF:主要应用方面:JAVA GUI7、Spring:主要应用于业务逻辑层,提供了与多数表示层技术/框架的无缝集成。,软件学院,五Spring是什么?Spring是一个开源框架,它由Rod Johnson创建。它是为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。目的:解决企业应用开发的复杂性。功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能范围:任何Java应用,软
7、件学院,六Spring的历史 Spring的基础架构起源于2000年早期,它是Rod Johnson在一些成功的商业项目中构建的基础设施。在2002后期,Rod Johnson发布了Expert One-on-One J2EE Design and Develoopment一书,并随书提供了一个初步的开发框架实现-interface21开发包,interface21就是书中阐述的思想的具体实现。后来,Rod Johnson在interface21开发包的基础之上,进行了进一步的改造和扩充,使其发展为一个更加开放、清晰、全面、高效的开发框架-Spring。2003年2月Spring框架正式成为一
8、个开源项目,并发布于SourceForge中。,软件学院,七Spring的使命(1)提供了一种管理对象的方法,可以把中间层对象有效地组织起来,一个完美的框架“黏合剂”。(2)有利于面向接口编程习惯的养成。(3)非侵入性,应用程序对Spring API的依赖可以减至最小限度。(4)写出易于测试的代码。(5)采用了分层结构,可以增量引入到项目中。,软件学院,八Spring受到的批判(1)Spring不是一个“标准”Spring不是J2EE规范的一部分,没有通过JCP(Java Community Process)的审核认可。批判来源于EJB的支持者,他们认为EJB是一个标准,是J2EE规范的一部分
9、。当然标准最主要的目的是希望在应用服务器之间是可移植的,可是EJB的移植却并不轻松,不同应用服务器的EJB部署描述文件总是有着差异。而且EJB开发的类完全依赖于EJB容器。而Spring对其管理的Bean没有任何形式的侵入,这样的Bean是普通Java对象(POJO),那么它不遵循Java标准,可以到处移植。,软件学院,(2)Spring是“超重量级”的 Spring涉及的内容确实很多(例如:提供了对JDBC、ORM、远程访问等的支持),但其本质还是Java技术的庞大。Spring只是为这些技术提供更好的使用方案而已。开发者可以选择只需要使用的部分。,软件学院,传统的J2EE系统开发技术在现今
10、应用开发中问题,传统J2EE应用开发效率低,应用服务器厂商对各种技术的支持并没有真正统一,导致J2EE应用没有真正实现 write once及run anywhere承诺,Spring作为开源的中间件,独立于各种应用服务器,Spring致力于J2EE应用的各层的解决方案,而不是仅仅专注于某一层方案,可以说Spring是企业应用开发的“一站式”选择,并贯穿表现层,业务层及持久层,然而Spring并没有取代那些已有的框架,而是与它们无缝地整合。,软件学院,利用Spring IoC和AOP实现J2EE平台中的EJB主要技术,Spring框架是一个轻量级的控制反转技术和面向切面编程技术的容器框架。(1
11、)标准J2EE技术平台中的主要的核心思想容器实现对象的生命周期管理分离应用逻辑组件和通用服务组件应用服务器容器可以管理各个组件的事务并可以跨组件的隔离(如EJB CMT特性),Spring又是如何实现的呢?,软件学院,(2)利用Spring IoC实现J2EE平台中所倡导的由容器实现对象的生命周期管理Spring IoC,借助于依赖注入设计模式,使得开发者不再需要自己来管理对象自身的生命周期及其关系,而且能够改善开发者对J2EE中的各种模式的应用。由于Spring IoC所要求的JavaBean为普通的POJO,而不象EJB那样的必须实现某个接口的要求。,从而达到轻量级的实现目标,软件学院,(
12、3)利用Spring AOP实现J2EE平台中所倡导的分离应用逻辑组件和通用服务组件借助Spring AOP,能够达到类似“容器”提供基础功能服务的目标。借助于Spring AOP中所提供的拦截器技术,开发者能够实现以声明的方式使用企业级服务-比如安全性服务、事务服务等。,软件学院,(4)Spring IoC和 Spring AOP组合在一起形成了Spring这样的一个有机整合,使得构建轻量级的J2EE平台的企业级的系统架构成为可能,而且事实证明,非常有效。没有Spring IoC的Spring AOP是不完善的,没有Spring AOP的Spring IoC是不健壮的。,Spring=IoC
13、+AOP,软件学院,使用Spring的应用系统开发的优点:“解耦”和“脱离容器”(1)Spring框架的核心思想我们可以用两个字来描述,那就是“解耦”。具体体现如下:应用系统的核心类代码之间的解耦。应用系统与其所在的底层应用服务器平台的解耦。解耦的好处:尽量形成一种松耦合的结构,使得应用系统有更多的灵活性和可扩展性。,软件学院,(2)在Spring中是如何实现上面的两种形式的解耦应用系统内部的类之间的解耦主要通过一种称为控制反转(IOC)的技术来实现。应用系统与底层应用服务器平台的解耦借助AOP技术来实现,Spring内置的AOP支持使得一些本来必须由容器支持的功能,比如事务控制可以脱离开J2
14、EE应用服务器容器而能够在容器外的普通Java虚拟机环境中运行。,软件学院,(3)使用Spring后养成“面向接口编程实现”的良好的编程习惯利用其对象“延时依赖注入”思想组装代码一方面减少了在使用这些对象的客户中的大量代码另一方面也提高系统扩展性,灵活性,实现插件式编程。利用AOP思想达到集中处理应用系统中的业务逻辑并分离附加技术支持和实现的代码,从而减少重复代码,构建出简洁和优雅解决方案。利用其对其它框架的支持比对Hibernate的SessionFactory、事务管理的封装,更简洁地应用和集成Hibernate等O/R Mapping框架和其它的框架技术(如Struts等)。,软件学院,
15、(4)如果不使用Spring,将额外需要编程实现更多代码 同时这些代码跟Spring提供的功能相比效果又怎样?比如事务处理、JDBC数据库访问等实现。,可能会出现“花了精力但又效果不好”局面,软件学院,九、Spring 中的IoC,(1)IoC=Inversion of Control(将原来由程序控制“对象之间的关系”转由外部容器来实现控制),能够减少对象的请求者对服务提供者的特定实现逻辑的依赖。,应用系统中的各个组件类不需要去查找或是实例化它们所依赖的其它的组件类,IoC:用白话来讲,就是由容器来控制程序中的各个类之间的关系,而非传统实现中直接在代码中由程序代码直接操控。这也就是所谓“控制
16、反转”的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。,软件学院,(2)IOC 是一种使应用程序逻辑外在化的设计模式因为提供服务的组件是被“注入”的而不是被“直接写入”到请求者(客户端)的代码中这样将能够大大地减少对象的请求者对服务提供者的特定实现逻辑的依赖-因为我们已经将依赖的具体“定位信息”从请求者中分离出来。,到此,我们需要反思我们传统的OOP编程实现中的“类之间的依赖和关联”的实现,软件学院,(3)我们在应用IoC进行系统开发的基本要求在代码中不直接创建目标对象,但是描述创建它们的方式。在代码中不直接与服务对象连接,但在配置文件中描述哪一个组件需要哪一项服务。程
17、序在运行时,由容器(在 Spring 框架中是 IOC 容器)负责将这些对象关联在一起。,而利用Spring可以使程序员连对象的创建都不用关心!,利用Java可以使程序员不用关心对象的销毁!,软件学院,软件学院,(4)体现某对象和对象之间关系的Spring配置文件,软件学院,十、Spring 中的依赖注入(1)DI=Dependency Injection,对IoC的另一种描述,(2)依赖注入产生过程,软件学院,(3)何谓依赖注入相对IoC 而言,“依赖注入”更加准确地描述了IoC的设计理念。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定-也就是由容器动态的将某种依赖关系注
18、入到目标组件之中。讲的通俗点,就是在运行期,由Spring根据配置文件,将其他对象的引用通过组件的提供的setter方法或者构造方法等进行设定。,软件学院,(4)IoC和DI的本质:改变依赖关系 组件和组件的之间的关系的依赖由原来的依赖“目标组件”改变为现在的依赖于“容器”。,为什么要进行改变?有什么意义?,为什么不应该直接依赖“目标组件”主要是由于目标组件随着需求的变化而经常改变,我们不希望在应用系统中由于某个“方面”发生改变而相关联的组件也必须跟着改变-分层的目的也就是能够达到良好的隔离,软件学院,哪又为什么可以依赖于“容器(Spring框架)”由于容器相对于应用系统而言应该是相对的稳定的
19、,不会频繁地发生改变-将“可变”和“不变”分离,依赖是客观存在的,问题是应该依赖谁?,软件学院,十二、在Spring中为什么要提供“依赖注入”设计理念,(1)目的依赖注入的目标并非为软件系统带来更多的功能应用它的目的是为了提升“组件重用”的概率,同时也为系统搭建一个灵活、可扩展的平台。,安全性、稳定性、可扩展性和可移植性是企业系统的追求目标,我们一直在提倡“组件重用”,但又如何达到以及实现的具体方法?,软件学院,(2)产生的效果-在系统架构方面提高了组件的可移植性和可重用度因为依赖注入机制减轻了组件之间的依赖关系这也是J2EE平台倡导“松藕合”的系统开发要求,您知道为什么要这样吗?,软件学院,
20、(3)产生的效果-在系统实现方面 能够更简洁的编程实现,软件学院,9、Spring如何实现依赖注入-通过reflection来实现DI,(1)Java中提供了对反射(reflection)技术的支持 那么DI是如何实现的呢?Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性。(2)Spring是通过反射技术来实现注入的,软件学院,十三、Spring IOC与工厂模式的对比,(1)IOC和DI的具体应用上的实现形式 将类之间的依赖转移到外部的配置文件中,避免在调用类中硬编码实现类。从而能够减少“服务的请求者”对“服
21、务提供者”的特定实现逻辑的依赖。(2)为达到上面相同的效果的常规开发实现方式在以往的开发中,通常利用工厂模式(Factory)来解决此类问题-使外部调用类不需关心具体实现类,这样非常适合在同一个事物类型具有多种不同实现的情况下使用。,软件学院,(3)两者的主要差别工厂模式中工厂类通常根据参数来判断应该实例化哪个实现类的对象,并且要求编程者自己编码实现工厂模式代码而Spring IoC只需要开发者将需要实例化的类在配置文件文件中加以配置就可以达到。因此,使用Spring IoC同样能得到工厂模式同样的效果,但编码更加简洁、高效。,(4)但采用工厂模式来实现时还将会有如下三个主要的缺点除非重新编译
22、,否则无法对“产品的实现类”进行替换。无法透明的为不同的产品组件提供多个不同形式的实现无法简单的进行切换实例产生的模型,软件学院,十四开发工具及jar包的选择(1)jdk1.6(2)Tomcat6.0(3)MyEclipse7.0(4)spring-framework-2.0(5)SpringFramework中文论坛 http:/,软件学院,10利用Spring开发一个小应用程序,定义接口:public interface GreetingService public void sayGreeting();定义实现类:public class GreetingServiceImpl impl
23、ements GreetingService private String greeting;public GreetingServiceImpl()public GreetingServiceImpl(String greeting)this.greeting=greeting;public void sayGreeting()System.out.println(greeting);public void setGreeting(String greeting)this.greeting=greeting;,软件学院,在Spring中配置的配置文件名:hello.xml Hello Wor
24、ld!这段配置相当于让Spring为我们产生对象,设置属性:GreetingServiceImpl greetingService=new GreetingServiceImpl();greetingService.setGreeting(“Hello World!”);,实例化配置的对象,以配置文件的bean节点的id值作为实例引用的关键字,软件学院,测试类程序:import;import;import;public class HelloWorld public static viod main(String args)BeanFactory factory=new XmlBeanFactory(new FileInputStream(“hello.xml”);GreetingService greetingService=(GreetingService)factory.getBean(“greetingServie”);greetingService.sayGreeting();,