版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、l o g ol o g ospring简介简介简介简介v 与与hibernatehibernate、strutsstruts一样,一样,springspring也是一个开源项目,它也是一个开源项目,它的作者是的作者是rod johnsonrod johnson,官方网站是,官方网站是http:// /。v springspring的基础思想来源于的基础思想来源于rod johnsonrod johnson的一本著名的的一本著名的j2eej2ee书书籍:籍:expert one-on-one
2、 j2ee design and development expert one-on-one j2ee design and development 。在这本书中,在这本书中,rod johnsonrod johnson列举列举ejbejb的种种问题,并提出了的种种问题,并提出了相应的解决办法。相应的解决办法。v 从那时起,人们对于从那时起,人们对于ejbejb的狂热追捧才算结束,转而进入更的狂热追捧才算结束,转而进入更理性的时代。理性的时代。 简介简介v rod johnsonrod johnson是悉尼大学博士,猜猜他的专业是什么?是悉尼大学博士,猜猜他的专业是什么?v rod johns
3、onrod johnson在开发出在开发出springspring之前,主要从事项目开发咨询之前,主要从事项目开发咨询与培训工作。在与培训工作。在springspring被广泛认可之后,创办了被广泛认可之后,创办了interface21interface21公司,致力于公司,致力于springspring咨询与培训咨询与培训. .v rod johnsonrod johnson还是还是jdo2.0jdo2.0和和servlet2.4servlet2.4专家组成员。专家组成员。简介简介v spring核心技术包括两个方面,一是控制反转核心技术包括两个方面,一是控制反转(inversion of
4、control, ioc),另一个是面向方面),另一个是面向方面编程(编程(aspect oriented programming, aop)。)。v spring囊括了十分丰富的内容,包括表述层、数据层,它囊括了十分丰富的内容,包括表述层、数据层,它提供了许多原来只有提供了许多原来只有ejb才能提供的功能(如宣称式的事才能提供的功能(如宣称式的事务管理),但务管理),但spring又无须运行在又无须运行在ejb容器上。容器上。v 无论无论spring涉足到哪一个领域,使用的都是简单的涉足到哪一个领域,使用的都是简单的javabean,一般无须再实现复杂的接口。,一般无须再实现复杂的接口。sp
5、ring框架结构框架结构 spring框架结构框架结构v core 封装包是框架的最基础部分,提供封装包是框架的最基础部分,提供ioc和依赖注入特性。这里的和依赖注入特性。这里的基础概念是基础概念是beanfactory,它提供对,它提供对factory模式的经典实现来消模式的经典实现来消除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依除对程序性单例模式的需要,并真正地允许你从程序逻辑中分离出依赖关系和配置。赖关系和配置。v dao提供了提供了jdbc的抽象层,它可消除冗长的的抽象层,它可消除冗长的jdbc编码和解析数据库编码和解析数据库厂商特有的错误代码。厂商特有的错误代码。 并
6、且,并且,jdbc 封装包还提供了一种比编程性更封装包还提供了一种比编程性更好的声明性事务管理方法,不仅仅是实现了特定接口,而且对好的声明性事务管理方法,不仅仅是实现了特定接口,而且对所有的所有的pojos(plain old java ob jects)都适用。都适用。v orm 封装包提供了常用的封装包提供了常用的“对象对象/关系关系”映射映射apis的集成层。的集成层。 其中其中包括包括jpa、jdo、hibernate和和 ibatis 。利用。利用orm封装包,可以封装包,可以混合使用所有混合使用所有spring提供的特性进行提供的特性进行“对象对象/关系关系”映射,如前边提映射,如
7、前边提到的简单声明性事务管理。到的简单声明性事务管理。spring框架结构框架结构v spring的的 aop 封装包提供了符合封装包提供了符合 aop alliance规范规范的面向方面的编程(的面向方面的编程(aspect-oriented programming)实现,让你可以定义,例如方法拦截器(实现,让你可以定义,例如方法拦截器(method-interceptors)和切点()和切点(pointcuts),从逻辑上讲,),从逻辑上讲,从而减弱代码的功能耦合,清晰的被分离开。而且,利用从而减弱代码的功能耦合,清晰的被分离开。而且,利用source-level的元数据功能,还可以将各种
8、行为信息合的元数据功能,还可以将各种行为信息合并到你的代码中,这有点象并到你的代码中,这有点象.net的的attribute的概念。的概念。spring框架结构框架结构v spring中的中的 web 包提供了基础的针对包提供了基础的针对web开发的集成开发的集成特性,例如多方文件上传,利用特性,例如多方文件上传,利用servlet listeners进行进行ioc容器初始化和针对容器初始化和针对web的的application context。当与当与webwork或或struts一起使用一起使用spring时,这个包使时,这个包使spring可与其他框架结合。可与其他框架结合。v spri
9、ng中的中的 mvc 封装包提供了封装包提供了web应用的应用的model-view-controller(mvc)实现。)实现。spring的的mvc框架框架并不是仅仅提供一种传统的实现,它提供了一种并不是仅仅提供一种传统的实现,它提供了一种 清晰的清晰的 分分离模型,在领域模型代码和离模型,在领域模型代码和web form之间。并且,还可之间。并且,还可以借助以借助spring框架的其他特性。框架的其他特性。准备工作准备工作v 下载下载springframework的最新版本,并解压缩到指定的最新版本,并解压缩到指定目录。目录。v 在在ide中新建一个项目,并将中新建一个项目,并将spri
10、ng.jar将其相关类库加将其相关类库加入项目。入项目。v spring采用采用apache common_logging,并结合,并结合apache log4j作为日志输出组件。为了在调试过程中能作为日志输出组件。为了在调试过程中能观察到观察到spring的日志输出,在的日志输出,在classpath中新建中新建perties配置文件,内容如下:配置文件,内容如下: log4j.rootlogger=debug, stdout log4j.appender.stdout=org.apache.log4j.consoleappender log4j.appender.stdo
11、ut.layout=org.apache.log4j.patternlayout log4j.appender.stdout.layout.conversionpattern=%c1 - %m%n概述概述v spring framework中目前最引人注目的,也就是名为中目前最引人注目的,也就是名为控制反转(控制反转(ioc inverse of control)或者依赖注入)或者依赖注入(di dependence injection)的设计思想,这的)的设计思想,这的确是相当优秀的设计理念,但是,光一个单纯的设计模式确是相当优秀的设计理念,但是,光一个单纯的设计模式并不能使得并不能使得sp
12、ring如此成功,而如此成功,而spring最成功的地方也最成功的地方也并不仅仅在于采用了并不仅仅在于采用了ioc/di的设计的设计,spring涵盖了应用涵盖了应用系统开发所涉及的大多数技术范畴,包括系统开发所涉及的大多数技术范畴,包括mvc、orm以以及及remote interface等,这些技术往往贯穿了大多数等,这些技术往往贯穿了大多数应用系统的开发过程。应用系统的开发过程。spring从开发者的角度对这些技术从开发者的角度对这些技术内容进行了进一步的封装和抽象,使得应用开发更为简便。内容进行了进一步的封装和抽象,使得应用开发更为简便。概述概述v spring并非一个强制性框架,它提
13、供了很多独立的组件可并非一个强制性框架,它提供了很多独立的组件可供选择。在一些项目中,就仅引用了供选择。在一些项目中,就仅引用了spring的的orm模板模板机制对数据存取层进行处理,并取得了相当理想的效果。机制对数据存取层进行处理,并取得了相当理想的效果。评定一个框架是否优良的条件固然有很多种,但是笔者始评定一个框架是否优良的条件固然有很多种,但是笔者始终认为,对于应用系统开发而言,我们面临着来自诸多方终认为,对于应用系统开发而言,我们面临着来自诸多方面的压力,此时,最能提高生产力的技术,也就是最有价面的压力,此时,最能提高生产力的技术,也就是最有价值的技术。很高兴,值的技术。很高兴,spr
14、ing让笔者找到了这样的感觉。让笔者找到了这样的感觉。spring 基础语义基础语义v 何谓控制反转(何谓控制反转(ioc = inversion of control),何谓),何谓依赖注入(依赖注入(di = dependency injection)?)?ioc,用白话来讲,就是由容器控制程序之间的关系,而,用白话来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓非传统实现中,由程序代码直接操控。这也就是所谓“控控制反转制反转”的概念所在:控制权由应用代码中转到了外部容的概念所在:控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。相对器,控制权
15、的转移,是所谓反转。相对ioc 而言,而言,“依赖依赖注入注入”的确更加准确的描述了这种古老而又时兴的设计理的确更加准确的描述了这种古老而又时兴的设计理念。从名字上理解,所谓依赖注入,即组件之间的依赖关念。从名字上理解,所谓依赖注入,即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。某种依赖关系注入到组件之中。spring 基础语义基础语义v依赖注入实例:依赖注入实例:v 为什么称之为为什么称之为“古老而又时兴古老而又时兴”的设计理念?至于的设计理念?至于“时兴时兴”自然不必多费唇舌,看看国内外大小
16、论坛上当红的讨论自然不必多费唇舌,看看国内外大小论坛上当红的讨论主题便知。至于主题便知。至于“古老古老”,相信大家对下面图片中的,相信大家对下面图片中的设备不会陌生:设备不会陌生:spring 基础语义基础语义v 这就是大家主要工作装备,这就是大家主要工作装备,ibm t40笔记本电脑一台、笔记本电脑一台、usb硬盘和硬盘和u盘各一只。想必大家在日常工作中也有类似盘各一只。想必大家在日常工作中也有类似的一套行头。这与依赖注入有什么关系?的一套行头。这与依赖注入有什么关系?图中三个设备都有一个共同点,都支持图中三个设备都有一个共同点,都支持usb 接口。当我们接口。当我们需要将数据复制到外围存储
17、设备时,可以根据情况,选择需要将数据复制到外围存储设备时,可以根据情况,选择是保存在是保存在u盘还是盘还是usb硬盘,下面的操作大家也都轻车熟硬盘,下面的操作大家也都轻车熟路,无非接通路,无非接通usb接口,然后在资源浏览器中将选定的文接口,然后在资源浏览器中将选定的文件拖放到指定的盘符。这样的操作在过去几年中每天都在件拖放到指定的盘符。这样的操作在过去几年中每天都在我们身边发生,而这也正是所谓依赖注入的一个典型案例,我们身边发生,而这也正是所谓依赖注入的一个典型案例,上面称之为上面称之为“古老古老”想必也不为过分。想必也不为过分。再看上例中,笔记本电脑与外围存储设备通过预先指定的再看上例中,
18、笔记本电脑与外围存储设备通过预先指定的一个接口(一个接口(usb)相连,对于笔记本而言,只是将用户指)相连,对于笔记本而言,只是将用户指spring 基础语义基础语义v 定的数据发送到定的数据发送到usb接口,而这些数据何去何从,则由当接口,而这些数据何去何从,则由当前接入的前接入的usb设备决定。在设备决定。在usb设备加载之前,笔记本不设备加载之前,笔记本不可能预料用户将在可能预料用户将在usb接口上接入何种设备,只有接口上接入何种设备,只有usb设设备接入之后,这种设备之间的依赖关系才开始形成。备接入之后,这种设备之间的依赖关系才开始形成。对应上面关于依赖注入机制的描述,在运行时(系统开
19、机对应上面关于依赖注入机制的描述,在运行时(系统开机,usb 设备加载)由容器(运行在笔记本中的设备加载)由容器(运行在笔记本中的windows操作系统)将依赖关系(笔记本依赖操作系统)将依赖关系(笔记本依赖usb设备进行数据存设备进行数据存取)注入到组件中(取)注入到组件中(windows文件访问组件)。文件访问组件)。这就是依赖注入模式在现实世界中的一个版本。这就是依赖注入模式在现实世界中的一个版本。依赖注入的目标并非为软件系统带来更多的功能,而是为依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展了提升组件重用的概率,并为系统搭建一个灵活
20、、可扩展的平台。的平台。spring 基础语义基础语义v依赖注入的几种实现类型:依赖注入的几种实现类型:v type1接口注入:接口注入:public class classa private interfaceb clzb;public dosomething() ojbect obj =class.forname(config.bimplementation).newinstance();clzb = (interfaceb)obj;clzb.doit()spring 基础语义基础语义v type2设值注入设值注入在各种类型的依赖注入模式中,设值注入模式在实际开发在各种类型的依赖注入模式中
21、,设值注入模式在实际开发中得到了最广泛的应用(其中很大一部分得中得到了最广泛的应用(其中很大一部分得 力于力于spring框架的影响)。在笔者看来,基于设置模式的依赖注入机框架的影响)。在笔者看来,基于设置模式的依赖注入机制更加直观、也更加自然。制更加直观、也更加自然。quick start中的示例,就是中的示例,就是典型的设置注入,即通过类的典型的设置注入,即通过类的setter方法完成依赖关系的方法完成依赖关系的设置。设置。spring 基础语义基础语义v type3构造子注入构造子注入构造子注入,即通过构造函数完成依赖关系的设定,如:构造子注入,即通过构造函数完成依赖关系的设定,如:pu
22、blic class dibyconstructor private final datasource datasource;private final string message;public dibyconstructor(datasource ds, string msg) this.datasource = ds;this.message = msg;spring 基础语义基础语义v 几种依赖注入模式的对比总结几种依赖注入模式的对比总结:接口注入模式因为历史较为悠久,在很多容器中都已经得接口注入模式因为历史较为悠久,在很多容器中都已经得到应用。但由于其在灵活性、易用性上不如其他两种注
23、入到应用。但由于其在灵活性、易用性上不如其他两种注入模式,因而在模式,因而在ioc的专题世界内并不被看好。的专题世界内并不被看好。type2和和type3型的依赖注入实现则是目前主流的型的依赖注入实现则是目前主流的ioc实现模式。实现模式。这两种实现方式各有特点,也各具优势这两种实现方式各有特点,也各具优势.spring 基础语义基础语义v type2 设值注入的优势设值注入的优势v 1 对于习惯了传统对于习惯了传统javabean开发的程序员而言,通过开发的程序员而言,通过setter方法设定依赖关系显得更加直观,更加自然。方法设定依赖关系显得更加直观,更加自然。v 2 如果依赖关系(或继承
24、关系)较为复杂,那么如果依赖关系(或继承关系)较为复杂,那么type3模式的构造函数也会相当庞大(我们需要在构造函数中设模式的构造函数也会相当庞大(我们需要在构造函数中设定所有依赖关系),此时定所有依赖关系),此时type2模式往往更为简洁。模式往往更为简洁。v 3 对于某些第三方类库而言,可能要求我们的组件必须对于某些第三方类库而言,可能要求我们的组件必须提供一个默认的构造函数(如提供一个默认的构造函数(如struts中的中的action),此),此时时type3类型的依赖注入机制就体现出其局限性,难以完类型的依赖注入机制就体现出其局限性,难以完成我们期望的功能。成我们期望的功能。sprin
25、g 基础语义基础语义v type3 构造子注入的优势:构造子注入的优势:1 “在构造期即创建一个完整、合法的对象在构造期即创建一个完整、合法的对象”,对于这条,对于这条java设计原则,设计原则,type3无疑是最好的响应者。无疑是最好的响应者。2 避免了繁琐的避免了繁琐的setter方法的编写,所有依赖关系均在构造方法的编写,所有依赖关系均在构造函数中设定,依赖关系集中呈现,更加易读。函数中设定,依赖关系集中呈现,更加易读。3 由于没有由于没有setter方法,依赖关系在构造时由容器一次性设方法,依赖关系在构造时由容器一次性设定,因此组件在被创建之后即处于相对定,因此组件在被创建之后即处于相
26、对“不变不变”的稳定状态,无的稳定状态,无需担心上层代码在调用过程中执行需担心上层代码在调用过程中执行setter方法对组件依赖关系方法对组件依赖关系产生破坏,特别是对于产生破坏,特别是对于singleton模式的组件而言,这可能对模式的组件而言,这可能对整个系统产生重大的影响。整个系统产生重大的影响。4 同样,由于关联关系仅在构造函数中表达,只有组件创建者同样,由于关联关系仅在构造函数中表达,只有组件创建者需要关心组件内部的依赖关系。对调用者而言,组件中的依赖关需要关心组件内部的依赖关系。对调用者而言,组件中的依赖关系处于黑盒之中。对上层屏蔽不必要的信息,也为系统的层次清系处于黑盒之中。对上
27、层屏蔽不必要的信息,也为系统的层次清晰性提供了保证。晰性提供了保证。spring 基础语义基础语义5 通过构造子注入,意味着我们可以在构造函数中决定依通过构造子注入,意味着我们可以在构造函数中决定依赖关系的注入顺序,对于一个大量依赖外部服务的组件而赖关系的注入顺序,对于一个大量依赖外部服务的组件而言,依赖关系的获得顺序可能非常重要,比如某个依赖关言,依赖关系的获得顺序可能非常重要,比如某个依赖关系注入的先决条件是组件的系注入的先决条件是组件的datasource及相关资源已经及相关资源已经被设定。被设定。可见,可见,type3和和type2模式各有千秋,而模式各有千秋,而spring、pico
28、container都对都对type3和和type2类型的依赖注入机类型的依赖注入机制提供了良好支持。这也就为我们提供了更多的选择余地制提供了良好支持。这也就为我们提供了更多的选择余地。理论上,以。理论上,以type3类型为主,辅之以类型为主,辅之以type2类型机制作类型机制作为补充,可以达到最好的依赖注入效果,不过对于基于为补充,可以达到最好的依赖注入效果,不过对于基于spring framework开发的应用而言,开发的应用而言,type2使用更加使用更加广泛。广泛。spring bean封装机制封装机制概述:概述:spring 从核心而言,是一个从核心而言,是一个di 容器,其设计哲学是
29、提供容器,其设计哲学是提供一种无侵入式的高扩展性框架。即无需代码中涉及一种无侵入式的高扩展性框架。即无需代码中涉及spring专有类,即可将其纳入专有类,即可将其纳入spring容器进行管理。容器进行管理。作为对比,作为对比,ejb则是一种高度侵入性的框架规范,它制定则是一种高度侵入性的框架规范,它制定了众多的接口和编码规范,要求实现者必须遵从。侵入性了众多的接口和编码规范,要求实现者必须遵从。侵入性的后果就是,一旦系统基于侵入性框架设计开发,那么之的后果就是,一旦系统基于侵入性框架设计开发,那么之后任何脱离这个框架的企图都将付出极大的代价。后任何脱离这个框架的企图都将付出极大的代价。为了避免
30、这种情况,实现无侵入性的目标。为了避免这种情况,实现无侵入性的目标。spring 大量大量引入了引入了java 的的reflection机制,通过动态调用的方式避机制,通过动态调用的方式避免硬编码方式的约束,并在此基础上建立了其核心组件免硬编码方式的约束,并在此基础上建立了其核心组件beanfactory,以此作为其依赖注入机制的实现基础。,以此作为其依赖注入机制的实现基础。spring bean封装机制封装机制概述:概述:org.springframework.beans包中包括了这些核心组包中包括了这些核心组件的实现类,核心中的核心为件的实现类,核心中的核心为beanwrapper和和be
31、anfactory类。这两个类从技术角度而言并不复杂,类。这两个类从技术角度而言并不复杂,但对于但对于spring 框架而言,却是关键所在,如果有时间,框架而言,却是关键所在,如果有时间,建议对其源码进行研读,必有所获。建议对其源码进行研读,必有所获。spring bean封装机制封装机制vbean wrapperv beanwrapper提供了设置和获取属性值(单个的或者是批量的),提供了设置和获取属性值(单个的或者是批量的),获取属性描述信息、查询只读或者可写属性等功能。不仅如此,获取属性描述信息、查询只读或者可写属性等功能。不仅如此,beanwrapper还支持嵌套属性,你可以不受嵌套深
32、度限制对子属性还支持嵌套属性,你可以不受嵌套深度限制对子属性的值进行设置。的值进行设置。看看如何通过看看如何通过spring beanwrapper操作一个操作一个javabean: object obj = class.forname(net.xiaxin.beans.user). newinstance(); beanwrapper bw = new beanwrapperimpl(obj); bw.setpropertyvalue(name, erica); system.out.println(username=+ bw.getpropertyvalue(name);通过这样的方式设定
33、通过这样的方式设定java bean属性实在繁琐,但它却提供了一个通属性实在繁琐,但它却提供了一个通用的属性设定机制,而这样的机制,也正是用的属性设定机制,而这样的机制,也正是spring依赖注入机制所依依赖注入机制所依赖的基础。赖的基础。spring bean封装机制封装机制vbean wrapperv 通过通过beanwrapper,我们可以无需在编码时就指定,我们可以无需在编码时就指定javabean的实现类和属性值,通过在配置文件加以设定,的实现类和属性值,通过在配置文件加以设定,就可以在运行期动态创建对象并设定其属性(依赖关系)。就可以在运行期动态创建对象并设定其属性(依赖关系)。上
34、面的代码中,我们仅仅指定了需要设置的属性名上面的代码中,我们仅仅指定了需要设置的属性名“name”,运行期,运行期,beanwrapper将根据将根据javabean规范,动态调用对象的规范,动态调用对象的“setname”方法进行属性设定。方法进行属性设定。属性名可包含层次,如对于属性名属性名可包含层次,如对于属性名“address.zipcode”,beanwrapper会调用会调用“getaddress().setzipcode”方法。方法。spring bean封装机制封装机制vbean factory bean factory顾名思义,负责创建并维护顾名思义,负责创建并维护bean实
35、例。实例。bean factory负责根据配置文件创建负责根据配置文件创建bean实例,可以实例,可以配置的项目有:配置的项目有:1 bean属性值及依赖关系(对其他属性值及依赖关系(对其他bean的引用)的引用)2 bean创建模式(是否创建模式(是否singleton模式,即是否只针模式,即是否只针对指定类维持全局唯一的实例)对指定类维持全局唯一的实例)3 bean初始化和销毁方法初始化和销毁方法4 bean的依赖关系的依赖关系spring bean封装机制封装机制vbean factory下面是一个较为完整的下面是一个较为完整的bean配置示例:配置示例:spring bean conf
36、iguration samplespring bean封装机制封装机制vvhello vvvvv vvvvvjava:comp/env/jdbc/samplevvvspring bean封装机制封装机制vbean factoryv idjava bean在在beanfactory中的唯一标识,代码中通过中的唯一标识,代码中通过beanfactory获取获取javabean实例时需以此作为索引名称。实例时需以此作为索引名称。v classjava bean 类名类名v singleton指定此指定此java bean是否采用单例(是否采用单例(singleton)模式,如果设)模式,如果设为为“
37、true”,则在,则在beanfactory作用范围内,只维护此作用范围内,只维护此java bean的一个实例,代码通过的一个实例,代码通过beanfactory获得此获得此java bean实例的引用。反之,如果设为实例的引用。反之,如果设为“false”,则通过,则通过beanfactory获取此获取此java bean实例时,实例时,beanfactory每每次都将创建一个新的实例返回。次都将创建一个新的实例返回。spring bean封装机制封装机制v init-method初始化方法,此方法将在初始化方法,此方法将在beanfactory创建创建javabean实例实例之后,在向应
38、用层返回引用之前执行。一般用于一些资源的初始之后,在向应用层返回引用之前执行。一般用于一些资源的初始化工作。化工作。v destroy-method销毁方法。此方法将在销毁方法。此方法将在beanfactory销毁的时候执行,一般用销毁的时候执行,一般用于资源释放。于资源释放。v depends-onbean依赖关系。一般情况下无需设定。依赖关系。一般情况下无需设定。spring会根据情况组会根据情况组织各个依赖关系的构建工作(这里示例中的织各个依赖关系的构建工作(这里示例中的depends-on属性属性非必须)。只有某些特殊情况下,如非必须)。只有某些特殊情况下,如javabean中的某些静
39、态中的某些静态变量需要进行初始化(这是一种变量需要进行初始化(这是一种badsmell,应该在设计上应,应该在设计上应该避免)。通过该避免)。通过depends-on指定其依赖关系可保证在此指定其依赖关系可保证在此bean加载之前,首先对加载之前,首先对depends-on所指定的资源进行加载。所指定的资源进行加载。spring bean封装机制封装机制v 通过通过节点可指定属性值。节点可指定属性值。beanfactory将自动根将自动根据据java bean对应的属性类型加以匹配。对应的属性类型加以匹配。下面的下面的”desc”属性提供了一个属性提供了一个null值的设定示例。注意值的设定示
40、例。注意代表一个空字符串,如果需要将属性值代表一个空字符串,如果需要将属性值设定为设定为null,必须使用,必须使用节点。节点。v 指定了属性对指定了属性对beanfactory中其他中其他bean的引用关系。示例的引用关系。示例中,中,theaction的的datasource属性引用了属性引用了id为为catasource的的bean。beanfactory将在运行期创建将在运行期创建datasource bean实例,并将其引用传入实例,并将其引用传入theaction bean的的datasource属性。属性。spring bean封装机制封装机制v 下面的代码演示了如何通过下面的代
41、码演示了如何通过beanfactory获取获取bean实例:实例:inputstream is = new fileinputstream(bean.xml);xmlbeanfactory factory = new xmlbeanfactory(is);action action = (action) factory.getbean(theaction);此时我们获得的此时我们获得的action实例,由实例,由beanfactory进行加进行加载,并根据配置文件进行了初始化和属性设定。载,并根据配置文件进行了初始化和属性设定。联合上面关于联合上面关于beanwrapper的内容,我们可以看到
42、,的内容,我们可以看到,beanwrapper实现了针对单个实现了针对单个bean的属性设定操作。的属性设定操作。而而beanfactory则是针对多个则是针对多个bean的管理容器,根据给的管理容器,根据给定的配置文件,定的配置文件,beanfactory从中读取类名、属性名从中读取类名、属性名/值,值,然后通过然后通过reflection机制进行机制进行bean加载和属性设定。加载和属性设定。spring bean封装机制封装机制vapplicationcontextbeanfactory提供了针对提供了针对java bean的管理功能,而的管理功能,而applicationcontext
43、提供了一个更为框架化的实现(从提供了一个更为框架化的实现(从上面的示例中可以看出,上面的示例中可以看出,beanfactory的使用方式更加的使用方式更加类似一个类似一个api,而非,而非framework style)。)。applicationcontext覆盖了覆盖了beanfactory的所有功能的所有功能,并提供了更多的特性。此外,并提供了更多的特性。此外,applicationcontext为为与现有应用框架相整合,提供了更为开放式的实现(如对与现有应用框架相整合,提供了更为开放式的实现(如对于于web应用,我们可以在应用,我们可以在web.xml中对中对applicationco
44、ntext进行配置)。相对进行配置)。相对beanfactory而言,而言,applicationcontext提供了以下扩展功能:提供了以下扩展功能:spring bean封装机制封装机制vapplicationcontextv 1 国际化支持国际化支持我们可以在我们可以在beans.xml文件中,对程序中的语言信息(如文件中,对程序中的语言信息(如提示信息)进行定义,将程序中的提示信息抽取到配置文提示信息)进行定义,将程序中的提示信息抽取到配置文件中加以定义,为我们进行应用的各语言版本转换提供了件中加以定义,为我们进行应用的各语言版本转换提供了极大的灵活性。极大的灵活性。v 2 资源访问资
45、源访问 支持对文件和支持对文件和url的访问。的访问。v 3 事件传播事件传播事件传播特性为系统中状态改变时的检测提供了良好支持事件传播特性为系统中状态改变时的检测提供了良好支持v 4 多实例加载多实例加载可以在同一个应用中加载多个可以在同一个应用中加载多个context实例。实例。spring bean封装机制封装机制vapplicationcontextv 1) 国际化支持国际化支持国际化支持在实际开发中可能是最常用的特性。对于一个国际化支持在实际开发中可能是最常用的特性。对于一个需要支持不同语言环境的应用而言,需要支持不同语言环境的应用而言,我们所采取的最常用我们所采取的最常用的策略一般
46、是通过一个独立的资源文件(如一个的策略一般是通过一个独立的资源文件(如一个properties文件)完成所有语言信息(如界面上的提示信文件)完成所有语言信息(如界面上的提示信息)的配置,息)的配置,spring对这种传统的方式进行了封装,并提对这种传统的方式进行了封装,并提供了更加强大的功能,如信息的自动装配以及热部署功能供了更加强大的功能,如信息的自动装配以及热部署功能(配置文件修改后自动读取,而无需重新启动应用程序)(配置文件修改后自动读取,而无需重新启动应用程序),下面是一个典型的示例:,下面是一个典型的示例:spring bean封装机制封装机制v vspring quick star
47、tvvvvmessagesvvvv spring bean封装机制封装机制这里声明了一个名为这里声明了一个名为messagesource的的bean(注意对(注意对于于message定义,定义,bean id必须为必须为messagesource,这是目前,这是目前spring的编码规约),对应类为的编码规约),对应类为resourcebundlemessagesource,目前,目前spring中中提供了两个提供了两个messagesource接口的实现,即接口的实现,即resourcebundlemessagesource和和reloadableresourcebundlemessages
48、ource,后者提供了无需重启即可重新加载配置信息的特性。在配后者提供了无需重启即可重新加载配置信息的特性。在配置节点中,我们指定了一个配置名置节点中,我们指定了一个配置名“messages”。spring会自动在会自动在classpath根路径中按照如下顺序搜根路径中按照如下顺序搜寻配置文件并进行加载(以寻配置文件并进行加载(以locale为为zh_cn为例)为例):spring bean封装机制封装机制v messages_zh_cn.propertiesv messages_pertiesv pertiesv messages_zh_cn.classv
49、 messages_zh.classv messages.class示例中包含了两个配置文件,内容如下:示例中包含了两个配置文件,内容如下:messages_zh_cn.properties:userinfo=当前登录用户当前登录用户: 0 登录时间登录时间:1messages_en_us.properties:userinfo=current login user: 0 login time:1spring bean封装机制封装机制v 我们可以通过下面的语句进行测试:我们可以通过下面的语句进行测试:v applicationcontext ctx=newv filesystemxmlappl
50、icationcontext(bean.xml);v object arg = new objecterica,calendar.getinstance().gettime()v ;v /以系统默认以系统默认locale加载信息加载信息(对于中文对于中文winxp而言,而言,默认为默认为zh_cn)v string msg = ctx.getmessage(userinfo, arg);v system.out.println(message is = +msg);spring bean封装机制封装机制v2) 资源访问资源访问applicationcontext.getresource方法提供
51、了对资源文件访问方法提供了对资源文件访问支持,如:支持,如:resource rs = ctx.getresource(classpath:perties);file file = rs.getfile();上例从上例从classpath根路径中查找根路径中查找perties文件并获取文件并获取其文件句柄。其文件句柄。getresource方法的参数为一个资源访问地址,如:方法的参数为一个资源访问地址,如:file:c:/perties/pertiesclasspath:perties注意注意g
52、etresource返回的返回的resource并不一定实际存在,可以通过并不一定实际存在,可以通过resource.exists()方法对其进行判断。方法对其进行判断。spring bean封装机制封装机制v 3) 事件传播事件传播applicationcontext基于基于observer模式(模式(java.util包中有对应实现),提供了针对包中有对应实现),提供了针对bean的事件传播功能。通的事件传播功能。通过过application. publishevent方法,我们可以将事件方法,我们可以将事件通知系统内所有的通知系统内所有的applicationlistener。事件传播的
53、一个典型应用是,当事件传播的一个典型应用是,当bean中的操作发生异常(中的操作发生异常(如数据库连接失败),则通过事件传播机制通知异常监听如数据库连接失败),则通过事件传播机制通知异常监听器进行处理。器进行处理。spring bean封装机制封装机制vweb context上面的示例中,上面的示例中,applicationcontext均通过编码加载。对于均通过编码加载。对于web应用,应用,spring提供了可配置的提供了可配置的applicationcontext加载机制。加载机制。加载器目前有两种选择:加载器目前有两种选择:contextloaderlistener和和contextl
54、oaderservlet。这两者在功能上完全等同,只是一个是。这两者在功能上完全等同,只是一个是基于基于servlet2.3版本中新引入的版本中新引入的listener接口实现,而另一个基于接口实现,而另一个基于servlet接口实现。开发中可根据目标接口实现。开发中可根据目标web容器的实际情况进行选择容器的实际情况进行选择。配置非常简单,在。配置非常简单,在web.xml中增加:中增加:org.springframework.web.context.contextloaderlistenerspring bean封装机制封装机制或:或: contextorg.springframework
55、.web.context.contextloaderservlet1通过以上配置,通过以上配置,web容器会自动加载容器会自动加载/web-inf/applicationcontext.xml初始化初始化applicationcontext实例,如果需要指定配置文件位置实例,如果需要指定配置文件位置,可通过,可通过context-param加以指定:加以指定:spring bean封装机制封装机制contextconfiglocation/web-inf/myapplicationcontext.xml配置完成之后,即可通过配置完成之后,即可通过webapplicationcontextuti
56、ls.getwebapplicationcontext方法在方法在web应用中获取应用中获取applicationcontext引用。引用。aopv aop是是oop的延续,是的延续,是aspect oriented programming的缩写,意思是面向方面编程。的缩写,意思是面向方面编程。面向切面面向切面编程编程(aop)提供另外一种角度来思考程序结构,通过这)提供另外一种角度来思考程序结构,通过这种方式弥补了面向对象编程(种方式弥补了面向对象编程(oop)的不足。)的不足。 除了类除了类(classes)以外,)以外,aop提供了提供了 切面切面。切面对关注点进行。切面对关注点进行模块
57、化,例如横切多个类型和对象的事务管理。模块化,例如横切多个类型和对象的事务管理。 (这些关(这些关注点术语通常称作注点术语通常称作 横切(横切(crosscutting) 关注点。)关注点。) v spring的一个关键的组件就是的一个关键的组件就是 aop框架框架。 尽管如此,尽管如此,spring ioc容器并不依赖于容器并不依赖于aop,这意味着你可以自由,这意味着你可以自由选择是否使用选择是否使用aop,aop提供强大的中间件解决方案,这提供强大的中间件解决方案,这使得使得spring ioc容器更加完善。容器更加完善。 aopv spring中所使用的中所使用的aop:提供声明式企业
58、服务,特别是为了替代提供声明式企业服务,特别是为了替代ejb声明式服务。声明式服务。 最重要的服务是最重要的服务是 声明性事务管理(声明性事务管理(declarative transaction management) , 这个服务建立在这个服务建立在spring的抽象事务管理(的抽象事务管理(transaction abstraction)之上。之上。 允许用户实现自定义的切面,用允许用户实现自定义的切面,用aop来完善来完善oop的使用。这样你可以把的使用。这样你可以把spring aop看作是对看作是对spring的的一种增强,它使得一种增强,它使得spring可以不需要可以不需要ejb就能提供声明式就能提供声明式事务管理;事务管理; 或者也可以使用或者也可以使用spring aop框架的全部功能框架的全部功能来实现自定义的切面。来实现自定义的切面。 aopv 举例:假设有在一个应用系统中,有一个共享的数据必须被并发举例:假设有在一个应用系统中,有一个共享的数据必须被并发同时访
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 有关虎的语文题目与答案
- 门窗知识试题与参考答案解析
- 麻醉护理学专项试题及答案展示
- 抗肥胖药练习题及答案大整合
- 2026年管道工职业技能等级测试卷及答案
- 2026年公卫执业医师流行病学专项模拟题及答案
- 2026年防排烟系统检测维护考试试卷试题及答案
- 2026年湘潭公务员考试(行政职业能力测验)测试题及答案
- 造纸设备巡检考核题目及答案
- 2026年水运工程造价专业考试试卷及答案
- 康复护理扩容提升工程技术方案
- 眉山环天人才发展有限公司2026年下半年四川天府新区眉山片区公开招聘编外人员考试参考题库及答案详解
- 2026年秋季西师大版小学一年级上册数学教学计划
- 新版2025-2026部编人教版小学语文1一年级上册(全册)教案设计合集
- 基层医疗卫生机构慢性病健康管理中心建设与服务指南(2026年)
- 2026秋季小学生开学第一课
- (2026秋新版)苏教版六年级数学上册全册教案
- 新学期(2026年秋)高中班主任工作计划
- 人教版六年级数学上册教学计划
- 《晶体硅光伏组件回收处理方法-热解法》
- 工程材料检测方案
评论
0/150
提交评论