Spring框架应用_第1页
Spring框架应用_第2页
Spring框架应用_第3页
Spring框架应用_第4页
Spring框架应用_第5页
已阅读5页,还剩82页未读 继续免费阅读

下载本文档

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

文档简介

1、Spring框架应用主要内容Spring框架基本知识Spring框架开发准备Spring框架开发实例1.1 Spring基本知识基本知识Spring是是Java平台上一个开源应用框架,它有着深厚的历史根基。平台上一个开源应用框架,它有着深厚的历史根基。Spring最初起源于最初起源于Rod Johnson于于2002年所著的年所著的Expert One-on-One:J2EE Design and Development一书中的基础性代码。在该书中,一书中的基础性代码。在该书中,Rod Johnson阐述了大量阐述了大量Spring框架的设计思想,并对框架的设计思想,并对J2EE平台进行了平台

2、进行了深层次的思考,指出了深层次的思考,指出了EJB存在的结构臃肿的问题。他认为采用一种轻量存在的结构臃肿的问题。他认为采用一种轻量级的、基于级的、基于JavaBean的框架就可以满足大多数程序开发的需要。的框架就可以满足大多数程序开发的需要。2003年,年,Rod Johnson公开了所描述框架的源代码,这个框架逐渐演变公开了所描述框架的源代码,这个框架逐渐演变成了我们所熟知的成了我们所熟知的Spring框架。框架。2004年年3月发布的月发布的1.0版本是版本是Spring的第的第一个具有里程碑意义的版本。这个版本发布之后,一个具有里程碑意义的版本。这个版本发布之后,Spring框架在框架

3、在Java社社区中变得异常流行。现在,区中变得异常流行。现在,Spring已经获得了广泛的欢迎,并被许多公司已经获得了广泛的欢迎,并被许多公司认为是具有战略意义的重要框架。认为是具有战略意义的重要框架。1.1.1 Spring的基本概念的基本概念Spring框架是基于框架是基于Java平台的,它为应用程序的开发提供了全面的平台的,它为应用程序的开发提供了全面的基础设施支持。基础设施支持。Spring专注于基础设施,这将使得开发者能更好的专注于基础设施,这将使得开发者能更好的致力于应用开发而不用去关心底层的架构。致力于应用开发而不用去关心底层的架构。Spring框架本身并未强制使用任何特别的编程

4、模式。从设计上看,框架本身并未强制使用任何特别的编程模式。从设计上看,Spring框架给予了框架给予了Java程序员许多自由度,但同时对业界存在的一程序员许多自由度,但同时对业界存在的一些常见问题也提供了规范的文档和易于使用的方法。些常见问题也提供了规范的文档和易于使用的方法。Spring框架的核心功能适用于任何框架的核心功能适用于任何Java应用。在基于应用。在基于Java企业平企业平台上的大量台上的大量Web应用中,积极的拓展和改进已经形成。而应用中,积极的拓展和改进已经形成。而Spring的的用途也不仅限于服务器端的开发,从简单性、可测试性和松耦合的用途也不仅限于服务器端的开发,从简单性

5、、可测试性和松耦合的角度来说,任何角度来说,任何Java应用都可以从应用都可以从Spring中获得好处。中获得好处。1.1.1 Spring的基本概念的基本概念1Spring框架优势Spring框架能有效地组织中间层对象。框架能有效地组织中间层对象。Spring框架实现了真正意义上的面向接口编程,可实现组件之间的框架实现了真正意义上的面向接口编程,可实现组件之间的高度解耦。高度解耦。Spring所秉承的设计思想就是让使用所秉承的设计思想就是让使用Spring创建的那些应用都尽可创建的那些应用都尽可能少的依赖于它的能少的依赖于它的APIs。使用使用Spring构建的应用程序易于进行单元测试。构建

6、的应用程序易于进行单元测试。 Spring提高了代码的可重用性,它尽可能避免在程序中硬编码。提高了代码的可重用性,它尽可能避免在程序中硬编码。Spring为数据存取提供了一个一致的框架,简化了底层数据库的访为数据存取提供了一个一致的框架,简化了底层数据库的访问方式。问方式。1.1.1 Spring的基本概念的基本概念2依赖注入(DI)和控制反转(IOC)依赖注入(依赖注入(Dependency Injection)和控制反转()和控制反转(Inversion of Control)实际上是同一个概念。)实际上是同一个概念。在传统的程序设计中,通常由调用者来创建被调用者的实例,而在在传统的程序设

7、计中,通常由调用者来创建被调用者的实例,而在依赖注入或控制反转的定义中,调用者不负责被调用者的实例创建依赖注入或控制反转的定义中,调用者不负责被调用者的实例创建工作,该工作由工作,该工作由Spring框架中的容器来负责,它通过开发者的配置框架中的容器来负责,它通过开发者的配置来判断实例的类型,创建后再注入调用者。由于来判断实例的类型,创建后再注入调用者。由于Spring容器负责创容器负责创建被调用者实例,实例创建后又负责将该实例注入调用者,因此称建被调用者实例,实例创建后又负责将该实例注入调用者,因此称为依赖注入为依赖注入(Dependency Injection);而被调用者的实例创建工作;

8、而被调用者的实例创建工作不再由调用者来创建而是由不再由调用者来创建而是由Spring来创建,因此称为控制反转来创建,因此称为控制反转(Inversion of Control)。1.1.1 Spring的基本概念的基本概念3面向切面编程(AOP)AOP(Aspect-Oriented Programming),也就是面向切面编程,它是面),也就是面向切面编程,它是面向对象编程(向对象编程(OOP)的补充和完善。)的补充和完善。在在OOP中通过封装、继承和多态性等概念建立起了多个对象之间的层次结中通过封装、继承和多态性等概念建立起了多个对象之间的层次结构,但当需要为这些分散的对象加入一些公共行为

9、时,构,但当需要为这些分散的对象加入一些公共行为时,OOP就显得力不从就显得力不从心了。换句话说就是,心了。换句话说就是,OOP擅长的是定义从上到下的关系,但是并不适合擅长的是定义从上到下的关系,但是并不适合定义从左到右的关系。定义从左到右的关系。AOP的出现恰好解决了的出现恰好解决了OOP技术的这种局限性。技术的这种局限性。AOP利用了一种称为利用了一种称为“横横切切”的技术,将封装好的对象剖开,找出其中对多个对象产生影响的公共行的技术,将封装好的对象剖开,找出其中对多个对象产生影响的公共行为,并将其封装为一个可重用的模块,这个模块被命名为为,并将其封装为一个可重用的模块,这个模块被命名为“

10、切面切面”(Aspect)。切面将那些与业务无关,却被业务模块共同调用的逻辑提取)。切面将那些与业务无关,却被业务模块共同调用的逻辑提取并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高并封装起来,减少了系统中的重复代码,降低了模块间的耦合度,同时提高了系统的可维护性。了系统的可维护性。1.1.1 Spring的基本概念的基本概念4日志在在Spring中,日志主要用来监控代码中变量的变化,跟踪代中,日志主要用来监控代码中变量的变化,跟踪代码运行的轨迹,在开发环境中担当调试器,向控制台或文件码运行的轨迹,在开发环境中担当调试器,向控制台或文件输出信息。在输出信息。在Spring框

11、架中,日志记录是必不可少的,如果框架中,日志记录是必不可少的,如果没有对应的依赖包,会产生错误。没有对应的依赖包,会产生错误。1.1.2 Spring框架模块框架模块Spring框架遵从模块的架构方式,由总共框架遵从模块的架构方式,由总共20多个模块组成多个模块组成,包括核心容器,包括核心容器数据访问数据访问/集成集成WebAOP等。这些等。这些模块为我们提供了开发企业级应用所需要的一切东西。在模块为我们提供了开发企业级应用所需要的一切东西。在开发过程中,这些模块并不都是必须的,可以针对具体的开发过程中,这些模块并不都是必须的,可以针对具体的应用自由选择所需要的模块。还可以将应用自由选择所需要

12、的模块。还可以将Spring与其他框架与其他框架或库进行集成,使得开发过程更有针对性更有效率。或库进行集成,使得开发过程更有针对性更有效率。1.2 Spring开发准备开发准备1.2.1 下载下载Spring开发包开发包 目前目前Spring框架的开发包的最新稳定版是框架的开发包的最新稳定版是3.1.1,本书就采用该版,本书就采用该版本来介绍本来介绍Spring框架。开发包框架。开发包“spring-framework-3.1.1.RELEASE.zip”可到可到Spring官方网站官方网站/上下载。上下载。1.2.2 下载下载commons

13、-logging包包登录站点登录站点/logging.cgi 可下载可下载commons-logging的压缩包的压缩包 “commons-logging-1.1.1-bin.zip”。1.2.3 Spring框架配置框架配置在下载完在下载完Spring框架开发所需要的开发包后,将其解压缩。打开框架开发所需要的开发包后,将其解压缩。打开Spring开发包解压缩目录,可以看到下图所示目录。开发包解压缩目录,可以看到下图所示目录。1.2.3 Spring框架配置框架配置将将commons-logging压缩包解压缩,打开其解压缩目录,可以看到压缩包解

14、压缩,打开其解压缩目录,可以看到下图所示目录。下图所示目录。 1.3 Spring开发实例开发实例1.3.1 开发实例开发实例【例例15-1】下面通过该实例来介绍下面通过该实例来介绍Spring框架程序的一般构建方式。框架程序的一般构建方式。1.3.2 Spring的的IoC容器容器Spring的的IoC容器是一个提供容器是一个提供IoC支持的轻量级容器,支持的轻量级容器,IoC容器为管理对象之容器为管理对象之间的依赖关系提供了基础功能。间的依赖关系提供了基础功能。Spring为我们提供了两种容器:为我们提供了两种容器:BeanFactory和和ApplicationContext。BeanF

15、actory由由org.springframework.beans.factory.BeanFactory接口定接口定义,是基础类型的义,是基础类型的IoC容器,并能提供完整的容器,并能提供完整的IoC服务支持。服务支持。IoC容器需要为容器需要为其具体的实现提供基本的功能规范,而其具体的实现提供基本的功能规范,而BeanFactory接口则提供了该功能规接口则提供了该功能规范的设计,每个具体的范的设计,每个具体的Spring IoC容器都要满足容器都要满足BeanFactory接口的定义。接口的定义。ApplicationContext由由org.springframework.contex

16、t.ApplicationContext接口定义,是以接口定义,是以BeanFactory为基础构建的。为基础构建的。此外,此外,Spring还提供了还提供了BeanFactory和和ApplicationContext的几种实现类,的几种实现类,它们也都称为它们也都称为Spring的容器。的容器。1.3.2 Spring的的IoC容器容器1BeanFactory及其工作原理BeanFactory在在Spring中的作用至关重要,它实际上是一个用于配中的作用至关重要,它实际上是一个用于配置和管理置和管理Java类的内部接口,负责初始化各种类的内部接口,负责初始化各种Bean并调用它们的并调用它

17、们的生命周期方法。生命周期方法。Spring中提供了几种中提供了几种BeanFactory的实现方法,最常使用的是的实现方法,最常使用的是org.springframework.beans.factory.xml.XmlBeanFactory,它,它会根据会根据XML配置文件中的定义来装配配置文件中的定义来装配Bean。创建创建BeanFactory实例时,需要提供实例时,需要提供Spring容器所管理的容器所管理的Bean的的详细配置信息。详细配置信息。Spring的配置信息通常采用的配置信息通常采用XML文件的形式来管理,文件的形式来管理,所以,在创建所以,在创建BeanFactory实例

18、时,需要依据实例时,需要依据XML配置文件中提供配置文件中提供的信息。的信息。1.3.2 Spring的的IoC容器容器2BeanFactory接口包含如下的基本方法 Boolean containsBean(String name):判断:判断Spring容器是否包容器是否包含含id为为name的的bean定义。定义。 Object getBean(String name):返回容器中:返回容器中id为为name的的bean。 Object getBean(String name, Class requiredType):返回容器:返回容器中中id为为name,并且类型为并且类型为requi

19、redType的的bean。 Class getType(String name):返回容器中:返回容器中id为为name的的bean的的类型。类型。 小结小结本章主要介绍了本章主要介绍了Spring框架的基本知识,包括控制反转和依框架的基本知识,包括控制反转和依赖注入,赖注入,Spring框架的核心模块,以及框架的核心模块,以及Spring框架的配置等内框架的配置等内容,并通过容,并通过SpringDemo实例使读者对使用实例使读者对使用Spring框架进行编框架进行编程有了一个初步的了解。程有了一个初步的了解。2. Spring之IoC原理与具体使用在实例项目中使用SpringSpring

20、 IoC原理简介Spring IoC简单模拟实现2.1 在实例项目中使用在实例项目中使用Spring 【例例16-1】在这个例子中,在这个例子中, 创建一个创建一个HelloWorld类,用类,用Spring来来实现在控制台上打印出实现在控制台上打印出“Hello World!”语句的功能。语句的功能。2.2 深入理解依赖注入深入理解依赖注入2.2.1 依赖注入依赖注入依赖注入(依赖注入(Dependency Injection, DI)也被称为控制反转)也被称为控制反转(Inversion of Control,IoC)。早在)。早在2004年,年,Martin Fowler就就在论文在论文

21、Inversion of Control Containers and the Dependency Injection pattern中提出问题:中提出问题:“哪些方面的控制被反转了?哪些方面的控制被反转了?”。根据他的观点根据他的观点是依赖对象的获得被反转了。于是他为控制反转是依赖对象的获得被反转了。于是他为控制反转创造了一个更好的名字:依赖注入。创造了一个更好的名字:依赖注入。由此我们知道,依赖注入和控制反转的含义完全相同,只是从两个由此我们知道,依赖注入和控制反转的含义完全相同,只是从两个角度来描述了同一个概念。对于一个角度来描述了同一个概念。对于一个Spring初学者来说,这两种说初

22、学者来说,这两种说法同样生涩难懂,因此,我们尝试用更加简单通用的语言和例子来法同样生涩难懂,因此,我们尝试用更加简单通用的语言和例子来描述出这个概念。描述出这个概念。2.2.1 依赖注入依赖注入当某个当某个Java实例(调用者)需要另一个实例(调用者)需要另一个Java实例(被调用者)时,实例(被调用者)时,调用者自身需要负责实现这个获取过程调用者自身需要负责实现这个获取过程由程序内部代码来控制由程序内部代码来控制对象之间的关系。我们已经熟悉的方式是调用者采用对象之间的关系。我们已经熟悉的方式是调用者采用“new 构造方构造方法法”的形式来创建被调用者以实现两个或多个对象的组合,但是这的形式来

23、创建被调用者以实现两个或多个对象的组合,但是这种实现方式不仅会导致代码的耦合度高而且难于测试。一个好的设种实现方式不仅会导致代码的耦合度高而且难于测试。一个好的设计,不但要求代码尽可能多的实现复用,还要求组件之间尽量解耦。计,不但要求代码尽可能多的实现复用,还要求组件之间尽量解耦。而依赖注入的出现完美的解决了代码的高耦合度问题。而依赖注入的出现完美的解决了代码的高耦合度问题。2.2.1 依赖注入依赖注入 用一句话概括依赖注入就是用一句话概括依赖注入就是“不要来找我,我会去找你不要来找我,我会去找你”,也就,也就是说,一个类不需要去查找或实例化它们所依赖的类。对象间的是说,一个类不需要去查找或实

24、例化它们所依赖的类。对象间的依赖关系是在对象创建时由负责协调项目中各个对象的外部容器依赖关系是在对象创建时由负责协调项目中各个对象的外部容器来提供并管理的。也就是强调了对象间的某种依赖关系是由容器来提供并管理的。也就是强调了对象间的某种依赖关系是由容器在运行期间注入调用者的,控制程序间关系的实现交给了外部的在运行期间注入调用者的,控制程序间关系的实现交给了外部的容器来完成。这样,当调用者需要被调用者对象时,调用者不需容器来完成。这样,当调用者需要被调用者对象时,调用者不需要知道具体实现细节,它只需要从容器中拿出一个对象并使用就要知道具体实现细节,它只需要从容器中拿出一个对象并使用就可以了。可以

25、了。2.2.1 依赖注入依赖注入图2.3 调用者构造汽车对象图2.4 将汽车对象注入调用者对象2.2.2 依赖注入的依赖注入的3种实现方式种实现方式依赖注入存在着三种实现方式,分别是设值注入、构造方法依赖注入存在着三种实现方式,分别是设值注入、构造方法注入和接口注入。注入和接口注入。1设值注入设值注入是指设值注入是指IoC容器使用容器使用setter方法来注入被依赖的实例。通过调方法来注入被依赖的实例。通过调用无参构造器或无参用无参构造器或无参static工厂方法实例化工厂方法实例化bean之后,调用该之后,调用该bean的的setter方法,即可实现基于方法,即可实现基于setter的的DI

26、。2.2.2 依赖注入的依赖注入的3种实现方式种实现方式2构造方法注入构造方法注入是指构造方法注入是指IoC容器使用构造方法来注入被依赖的实例。基容器使用构造方法来注入被依赖的实例。基于构造器的于构造器的DI通过调用带参数的构造器来实现,每个参数代表着一通过调用带参数的构造器来实现,每个参数代表着一个依赖。个依赖。 2.2.2 依赖注入的依赖注入的3种实现方式种实现方式3接口注入接口注入需要类实现特定的接口或继承特定的类。但是这样一来,接口注入需要类实现特定的接口或继承特定的类。但是这样一来,类就必须依赖于这些特定的接口或特定的类,这也就意味着侵入性。类就必须依赖于这些特定的接口或特定的类,这

27、也就意味着侵入性。因此这种注入方式基本上已经被遗弃了。因此这种注入方式基本上已经被遗弃了。2.3 Spring IoC简单模拟实现简单模拟实现【例例16-5】模拟实现模拟实现Spring IoC容器。容器。使用了使用了java反射机制和反射机制和jdom操纵操纵XML文档的知识。文档的知识。 小结小结本章先介绍了一个项目实例,然后通过汽车的例子形象的解释了本章先介绍了一个项目实例,然后通过汽车的例子形象的解释了Spring中依赖注入中依赖注入ID和控制反转和控制反转IoC的思想,使读者明确它们实际的思想,使读者明确它们实际上是同一概念两种不同表达,进而揭示了依赖注入的本质和内涵。上是同一概念两

28、种不同表达,进而揭示了依赖注入的本质和内涵。接着,讨论了实现依赖注入的三种方式,包括设值方法注入、构造接着,讨论了实现依赖注入的三种方式,包括设值方法注入、构造方法注入和接口注入,其中接口注入的方式现在已不再使用。方法注入和接口注入,其中接口注入的方式现在已不再使用。最后,在深入理解了依赖注入和控制反转思想的基础上,通过编程最后,在深入理解了依赖注入和控制反转思想的基础上,通过编程模拟实现了模拟实现了Spring IoC容器的基本功能。容器的基本功能。3. Spring之进阶运用配置Bean的属性和依赖关系管理Bean的生命周期让Bean可以被Spring感知Spring的国际化3.1 配置配

29、置Bean的属性和依赖关系的属性和依赖关系3.1.1 Bean的配置的配置 要完成要完成Bean的配置,就需要告诉容器到底需要哪些的配置,就需要告诉容器到底需要哪些Bean以及容以及容器使用何种方式将它们装配在一起。器使用何种方式将它们装配在一起。 Spring的的IoC容器支持两种格式的配置文件:容器支持两种格式的配置文件:Properties文件格式文件格式和和XML文件格式。文件格式。XML配置文件通过配置文件通过XML文件来注册并管理文件来注册并管理Bean之间的依赖关系,它是最常用、功能最完整的配置文件表达之间的依赖关系,它是最常用、功能最完整的配置文件表达方式。方式。3.1.1 B

30、ean的配置的配置1定义BeanSpring的的IoC容器管理一个或多个容器管理一个或多个Bean,这些,这些Bean由容器根据由容器根据XML文件中提供的文件中提供的Bean配置信息进行创建。配置信息进行创建。XML配置文件的根元素是配置文件的根元素是,包含了多个包含了多个子元素,每个子元素,每个子元素定义了一个子元素定义了一个Bean,并描述了该,并描述了该Bean如如何被装配到何被装配到Spring容器中。容器中。3.1.1 Bean的配置的配置一个一个Bean通常包括通常包括id和和class两个属性。两个属性。id属性:是一个属性:是一个Bean的唯一标识符,容器对的唯一标识符,容器

31、对Bean的配置、管理都的配置、管理都通过该属性来完成。通过该属性来完成。Bean的的id属性在属性在Spring容器中应是唯一的,如果想给容器中应是唯一的,如果想给Bean添加别添加别名或想使用一些不合法的名或想使用一些不合法的XML字符,如字符,如“/”,则可以通过指定,则可以通过指定Bean的的name属性进行设定。属性进行设定。name属性:可以在属性:可以在name属性中为属性中为Bean指定多个名称(别名),指定多个名称(别名),每个名称之间使用逗号或分号隔开。每个名称之间使用逗号或分号隔开。class属性:该属性指定了属性:该属性指定了Bean的具体实现类,它必须是一个完整的具体

32、实现类,它必须是一个完整的类名,使用类的全限定名的类名,使用类的全限定名3.1.1 Bean的配置的配置下面的代码定义了两个下面的代码定义了两个Bean:3.1.2 设置普通属性值设置普通属性值的的value属性用于指定字符串类型或者基本类型的属性用于指定字符串类型或者基本类型的属性值,属性值,Spring利用利用JavaBeans PropertyEditors将解析出将解析出来的来的string类型转换成需要的参数值类型。默认情况下,类型转换成需要的参数值类型。默认情况下,value属性或者属性或者标签不仅能读取标签不仅能读取Java.lang.String类型,类型,还能将其转换成其他任

33、何基本类型或者对应包装类。还能将其转换成其他任何基本类型或者对应包装类。3.1.3 配置合作者配置合作者Bean 如果需要为如果需要为Bean设置的属性值是容器中的另一个设置的属性值是容器中的另一个Bean实例,则可以实例,则可以在在Spring的配置文件中使用的配置文件中使用property元素的子元素元素的子元素ref将一个将一个Bean注注入到另一个入到另一个Bean中。也可以使用中。也可以使用property元素的元素的ref属性来完成注入,属性来完成注入,两种方式的效果相同,只是使用两种方式的效果相同,只是使用ref属性的方式更为简洁。属性的方式更为简洁。 配置合作者配置合作者Bea

34、n时首先必须配置两个时首先必须配置两个bean:一个被注入的和一个注:一个被注入的和一个注入的目标,然后,就可以简单地在目标上使用入的目标,然后,就可以简单地在目标上使用ref属性配置注入了。属性配置注入了。3.1.3 配置合作者配置合作者Bean 3.1.4 注入集合值注入集合值很多情况下,我们需要在很多情况下,我们需要在Bean中配置一组对象的集合而不仅仅是单中配置一组对象的集合而不仅仅是单独的几个独的几个Bean或者基本类型值,针对这种情况,或者基本类型值,针对这种情况,Spring提供了直提供了直接向接向Bean注入一个对象的集合的方法。注入一个对象的集合的方法。在在Spring中,注

35、入集合值并不复杂:可以使用中,注入集合值并不复杂:可以使用或或元素来分别表示元素来分别表示List、Map、Set或者或者Properties对象,对象,然后向其中传入任何可用于注入的其他类型的独立元素即可,就像然后向其中传入任何可用于注入的其他类型的独立元素即可,就像给普通的给普通的标签配置属性一样。标签配置属性一样。3.2 管理管理Bean的生命周期的生命周期 Spring可以管理可以管理singleton作用域作用域Bean的生命周期,的生命周期,Spring可以可以精确地知道该精确地知道该Bean何时被创建,何时初始化完成,以及何时被销何时被创建,何时初始化完成,以及何时被销毁。对于毁

36、。对于prototype作用域的作用域的Bean,Spring仅仅负责创建,当容仅仅负责创建,当容器创建了器创建了Bean实例后,实例后,Bean实例完全交给客户端代码管理,容实例完全交给客户端代码管理,容器不再跟踪其生命周期。每次客户端请求器不再跟踪其生命周期。每次客户端请求prototype作用域的作用域的Bean时,时,Spring会创建一个新的实例,会创建一个新的实例,Spring容器并不管那些容器并不管那些被配置成被配置成prototype作用域的作用域的Bean的生命周期。的生命周期。3.2 管理管理Bean的生命周期的生命周期管理管理Bean的生命周期重点在于在某个的生命周期重点

37、在于在某个Bean生命周期的某些指生命周期的某些指定时刻接受通知。这样能够允许你的定时刻接受通知。这样能够允许你的Bean在其存活期间的指在其存活期间的指定时刻完成一些相关操作。这样的时刻可能有许多,但一般而定时刻完成一些相关操作。这样的时刻可能有许多,但一般而言,有两个生命周期时刻与言,有两个生命周期时刻与Bean关系显得尤为重要:关系显得尤为重要:postinitiation(初始化后)和(初始化后)和predestruction(销毁前)。(销毁前)。3.2 管理管理Bean的生命周期的生命周期Spring中,中,Bean的生命周期更加复杂,可以利用的生命周期更加复杂,可以利用Sprin

38、g提供的方提供的方法来定制法来定制Bean的创建过程。的创建过程。当一个当一个Bean被加载到被加载到Spring容器中时,它就具有了生命。而容器中时,它就具有了生命。而Spring在保证一个在保证一个Bean能够使用之前会预先做很多工作。能够使用之前会预先做很多工作。 3.2.1 Spring容器中容器中Bean的作用域的作用域在在Spring容器初始化一个容器初始化一个Bean实例时,可以同时为其指定特定的实例时,可以同时为其指定特定的作用域。作用域。在在Spring 2.0之前,之前,Bean只有两种作用域,分别是只有两种作用域,分别是singleton(单例单例)和和prototype

39、(原型),(原型),Spring 2.0以后的版本中,又增加了以后的版本中,又增加了session、request、global session三种专用于三种专用于Web应用程序上下应用程序上下文的文的Bean。在在Spring 3.0中,仍然支持上述中,仍然支持上述5种种Bean作用域,同时,用户还可作用域,同时,用户还可以根据自己的需要,增加新的以根据自己的需要,增加新的Bean类型,以满足实际应用的需求。类型,以满足实际应用的需求。3.2.1 Spring容器中容器中Bean的作用域的作用域Spring 3.0中支持的中支持的5种作用域如下种作用域如下:Singleton:单例模式,使用

40、:单例模式,使用singleton定义的定义的Bean在在Spring容器容器中将只有一个实例,也就是说:无论多少个中将只有一个实例,也就是说:无论多少个Bean引用到它,始终指引用到它,始终指向的是同一个对象。向的是同一个对象。Prototype:原型模式:每次通过:原型模式:每次通过Spring容器获取容器获取prototype定义的定义的Bean时,容器都将创建一个新的时,容器都将创建一个新的Bean实例。实例。Request:针对每一次:针对每一次HTTP请求都会产生一个新的请求都会产生一个新的Bean,而且该,而且该Bean仅在当前仅在当前HTTP request内有效。内有效。Se

41、ssion:针对每一次:针对每一次HTTP请求都会产生一个新的请求都会产生一个新的Bean,而且该,而且该Bean仅在当前仅在当前HTTP session内有效。内有效。Global session:类似于标准的:类似于标准的HTTP Session作用域,但是它仅作用域,但是它仅仅在基于仅在基于portlet的的web应用中有效。应用中有效。3.2.1 Spring容器中容器中Bean的作用域的作用域对于对于singleton作用域的作用域的Bean,由容器来管理,由容器来管理Bean的生命周期,容的生命周期,容器可以精确地掌握该器可以精确地掌握该Bean何时被创建,何时初始化完成以及何时被

42、何时被创建,何时初始化完成以及何时被销毁。当一个销毁。当一个Bean的作用域被设置为的作用域被设置为singleton时,那么在时,那么在Spring容器中就只存在一个共享的容器中就只存在一个共享的Bean实例,每次请求该实例,每次请求该Bean时,只要时,只要id与与Bean定义相匹配,则都将获得同一个实例。换句话说,容器只定义相匹配,则都将获得同一个实例。换句话说,容器只为为singleton作用域的作用域的Bean创建一个唯一实例。创建一个唯一实例。对于对于prototype作用域的作用域的Bean,每次请求一个,每次请求一个Bean实例时容器都会实例时容器都会返回一个新的、不同的实例,

43、此时,容器仅仅负责创建返回一个新的、不同的实例,此时,容器仅仅负责创建Bean实例,实例,且实例创建完成后,就将其完全交给客户端代码管理,容器不再跟且实例创建完成后,就将其完全交给客户端代码管理,容器不再跟踪其生命周期。踪其生命周期。3.2.2 Bean的实例化的实例化当一个当一个Bean实例化时,往往需要执行一些初始化工作,然后才能使实例化时,往往需要执行一些初始化工作,然后才能使用该用该Bean实例。反之,当不再需要某个实例。反之,当不再需要某个Bean实例时,则需要从容实例时,则需要从容器中删除它,此时也要按顺序做一些清理工作。器中删除它,此时也要按顺序做一些清理工作。Spring提供两

44、种方法在提供两种方法在Bean全部属性设置成功后执行指定行为:全部属性设置成功后执行指定行为:(1)使用)使用init-method属性;属性;(2)实现)实现initializingBean接口。接口。3.2.2 Bean的实例化的实例化1指定初始化方法使用使用init-method属性指定某个初始化方法需要在属性指定某个初始化方法需要在Bean全部依赖全部依赖关系设置完成后执行。这种回调机制在仅定义多个同类型关系设置完成后执行。这种回调机制在仅定义多个同类型Bean或或者希望自己的应用程序和者希望自己的应用程序和Spring解耦合时会十分有效。使用这种解耦合时会十分有效。使用这种机制的另一

45、个好处是:它能够让我们的机制的另一个好处是:它能够让我们的Spring应用程序同之前创应用程序同之前创建的或者由第三方提供的建的或者由第三方提供的Bean无缝完美地协同工作。无缝完美地协同工作。 3.2.2 Bean的实例化的实例化2实现InitializingBean接口Spring中的中的org.springframework.beans.factory.InitializingBean接口提供了定义初始化方法的一种方式。它允许容器在设置好接口提供了定义初始化方法的一种方式。它允许容器在设置好Bean的所有必需属性后给的所有必需属性后给Bean发通知,以执行初始化工作。一旦某个发通知,以执

46、行初始化工作。一旦某个Bean实现了实现了InitializingBean接口,那么这个接口,那么这个Bean的代码就与的代码就与Spring耦合到一起了。耦合到一起了。InitializingBean接口只定义了一个接口只定义了一个afterPropertiesSet方法,可以方法,可以在该方法内部对在该方法内部对Bean做一些初始化处理工作,如检查做一些初始化处理工作,如检查Bean配置以配置以确保其有效等。凡是继承了确保其有效等。凡是继承了InitializingBean接口的类,在初始化接口的类,在初始化Bean的时候都会执行其的时候都会执行其afterPropertiesSet方法。

47、方法。3.2.3 Bean的销毁的销毁与初始化类似,与初始化类似,Spring也提供了两种方法在也提供了两种方法在Bean实例实例销毁之前执行指定的动作。销毁之前执行指定的动作。 使用使用destroy-method属性;属性; 实现实现DisposableBean接口。接口。3.2.4 使用方法注入使用方法注入协调作用域协调作用域不同的不同的Bean Spring从从1.1版本时就引入了一个控制反转的新特性版本时就引入了一个控制反转的新特性方法注方法注入(入(method injection),它为协作者之间的交互提供了更大的),它为协作者之间的交互提供了更大的灵活性。方法注入一般使用的是灵

48、活性。方法注入一般使用的是loopup方法(查找方法)注入。方法(查找方法)注入。 当一个当一个Bean依赖另一个不同生命周期的依赖另一个不同生命周期的Bean时,设值注入或者时,设值注入或者构造方法注入会导致构造方法注入会导致singleton Bean去维护去维护non-singleton Bean的单个实例,但是的单个实例,但是lookup方法注入允许方法注入允许singleton Bean声声明一个它需要的明一个它需要的non-singleton依赖并在每次需要和其交互时返依赖并在每次需要和其交互时返回一个回一个non-singleton Bean的实例,同时无需实现任何的实例,同时无

49、需实现任何Spring专有接口。专有接口。 lookup方法注入利用了方法注入利用了Spring容器重写容器重写Bean中的抽象方法或具中的抽象方法或具体方法的能力体方法的能力,从而返回指定名字的从而返回指定名字的Bean实例,常用来获取一个实例,常用来获取一个non-singleton对象。对象。 3.3 让让Bean可以感知可以感知Spring容器容器3.3.1 使用使用BeanNameAware接口接口一个一个Bean能通过实现能通过实现BeanNameAware接口来获取自己接口来获取自己的名字,此接口只有一个方法:的名字,此接口只有一个方法:setBeanName(String na

50、me),该方法的,该方法的name参数是参数是Bean的的id,实现了该方法的,实现了该方法的Bean类可以通过该方法来获得部署该类可以通过该方法来获得部署该Bean时所指定的时所指定的id。在。在Bean的属性设置完以后,在初始化回调方法执行之前,的属性设置完以后,在初始化回调方法执行之前,setBeanName回调方法会先被调用。回调方法会先被调用。3.3 让让Bean可以感知可以感知Spring容器容器3.3.2 使用使用BeanFactoryAware接口、接口、ApplicationContextAware接口接口设计设计BeanFactoryAware接口的主要目的是为了让接口的主

51、要目的是为了让Bean能能够以编程的方式使用够以编程的方式使用getBean( )访问其他的访问其他的Bean。然而,实际中。然而,实际中应该避免这样的行为,这只会给应该避免这样的行为,这只会给Bean增加不必要的复杂度,并使增加不必要的复杂度,并使得代码与得代码与Spring耦合到一起。因此,更好的方式是使用依赖注入耦合到一起。因此,更好的方式是使用依赖注入为为Bean来提供协作对象。来提供协作对象。与与BeanFactoryAware类似,类似,ApplicationContextAware接接口能够取得口能够取得ApplicationContext容器的引用。容器的引用。3.4 Spri

52、ng的国际化支持的国际化支持Spring中提供了对国际化的支持。通过使用中提供了对国际化的支持。通过使用MessageSource接接口,应用程序可以访问口,应用程序可以访问Spring资源、调用消息并保存为不同语言种类。资源、调用消息并保存为不同语言种类。对于每一种想要支持的语言,需要维护一个跟其他语言中消息一致的对于每一种想要支持的语言,需要维护一个跟其他语言中消息一致的消息列表。消息列表。小结小结介绍了介绍了Spring容器中的容器中的Bean,然后介绍了,然后介绍了Bean依赖的配置,依赖的配置,并详细介绍了并详细介绍了Bean的作用域、生命周期以及怎样使一个的作用域、生命周期以及怎样

53、使一个Bean感知到感知到所在的环境。最后介绍了所在的环境。最后介绍了Spring的国际化支持。的国际化支持。4. Spring MVC框架及标签库解析Spring MVC技术解析Spring基础标签库解析Spring表单标签库Spring MVC综合实例4.1 解析解析Spring MVC技术技术4.1.1 MVC设计思想概述1MVC设计思想MVC指的是指的是Model-View-Controller,即把一个应用的输入、处理和输出流程,即把一个应用的输入、处理和输出流程按照按照Model、View和和Controller的方式进行分离,这样一个应用就被分成三的方式进行分离,这样一个应用就被

54、分成三层层模型层、视图层和控制层。模型层、视图层和控制层。一个一个Web应用可以有很多不同的视图(应用可以有很多不同的视图(View)。视图代表了用户的交互界面,)。视图代表了用户的交互界面,对于对于Web应用来说,可以是应用来说,可以是HTML,也可以是,也可以是JSP、XML等。在等。在MVC模式中,模式中,对于视图的处理仅包含视图上数据的采集和处理,而不包括对视图上业务流程对于视图的处理仅包含视图上数据的采集和处理,而不包括对视图上业务流程的处理。对业务流程的处理统一交由模型(的处理。对业务流程的处理统一交由模型(Model)负责。)负责。模型(模型(Model)负责业务的处理以及业务规

55、则的制定。模型接受视图请求的数)负责业务的处理以及业务规则的制定。模型接受视图请求的数据,并将最终处理结果返回。业务模型的设计是据,并将最终处理结果返回。业务模型的设计是MVC思想最主要的核心。思想最主要的核心。控制(控制(Controller)用于从用户接收请求,将模型和视图相匹配,以共同完成)用于从用户接收请求,将模型和视图相匹配,以共同完成用户的请求。用户的请求。4.1.1 MVC设计思想概述设计思想概述2Model 1和Model 2架构Model 1的基础是的基础是JSP文件,在文件,在Model 1模式下,一个模式下,一个Web应用几乎应用几乎全部由全部由JSP页面构成。这些页面构

56、成。这些JSP从从HTTP Request中获取所需的数中获取所需的数据,进行业务处理,然后通过据,进行业务处理,然后通过Response将结果返回给前端的浏览将结果返回给前端的浏览器。器。Model 1的实现比较简单,可以加快系统的开发进度。但是它将表的实现比较简单,可以加快系统的开发进度。但是它将表现层和业务逻辑混在在一起,使得现层和业务逻辑混在在一起,使得JSP页面同时充当了页面同时充当了View和和Controller两种角色,不利于系统的维护和代码的重用,因此,两种角色,不利于系统的维护和代码的重用,因此,Model 1模式只适合小型系统的开发。模式只适合小型系统的开发。4.1.1

57、MVC设计思想概述设计思想概述Model 2在在Model 1模式的基础上又引入了模式的基础上又引入了Servlet,它遵循了,它遵循了MVC的设计理念。在的设计理念。在Model 2模式中,模式中,Servlet充当前端控制器,接受客充当前端控制器,接受客户端发送的各种业务请求。户端发送的各种业务请求。 Model 2将模型层、视图层和控制层区分开,每层分别负责不同的将模型层、视图层和控制层区分开,每层分别负责不同的功能,改变了功能,改变了JSP页面与业务逻辑紧密耦合的状态,提供了更好的页面与业务逻辑紧密耦合的状态,提供了更好的代码重用性和扩展性。代码重用性和扩展性。4.1.2 Spring

58、 MVC的基本思想的基本思想Spring MVC是基于是基于Model 2实现的技术框架。在实现的技术框架。在Spring MVC中,中,Action不叫不叫Action,而被称为,而被称为Controller。Controller接受参数接受参数request和和response,并返回,并返回ModelAndView。Spring的的Web框架是围绕分发器(框架是围绕分发器(DispatcherServlet)设计的,)设计的,DispatcherServlet用来将请求分发到不同的处理器。用来将请求分发到不同的处理器。4.1.3 Spring MVC框架的特点框架的特点(1)Spring

59、 MVC框架的角色划分非常清晰。框架的角色划分非常清晰。(2)Spring MVC框架具有强大而直接的配置方式。框架具有强大而直接的配置方式。(3)Spring MVC框架具有良好的可适应性。框架具有良好的可适应性。(4)Spring MVC框架具有可重用的业务代码。框架具有可重用的业务代码。(5)Spring MVC框架具有可定制的绑定(框架具有可定制的绑定(binding)和验证)和验证(validation)功能。)功能。(6)Spring MVC框架具有可定制的处理器映射(框架具有可定制的处理器映射(handler mapping)和视图解析()和视图解析(view resolutio

60、n)功能。)功能。(7)Spring MVC框架具有可定制的本地化和主题解析。框架具有可定制的本地化和主题解析。(8)Spring MVC框架具有简单而强大的标签库。框架具有简单而强大的标签库。4.1.4 分发器(分发器(DispatcherServlet)在在 S p r i n g 中 , 对中 , 对 W e b 框 架 的 设 计 是 围 绕 分 发 器 (框 架 的 设 计 是 围 绕 分 发 器 ( D i s spatcherServlet)来进行的,)来进行的,DispatcherServlet是一个能将请是一个能将请求分发到控制器的求分发到控制器的Servlet,这个,这个S

温馨提示

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

评论

0/150

提交评论