




已阅读5页,还剩46页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Spring集成框架,1,目标,第一个Spring程序BeanFactory、ApplicationContextType2IoC、Type3IoC属性参考自动绑定集合对象注入Bean的生命周期,2,第一个Spring程序,首先要取得Spring的相关文件,Spring的文件放在SourceForge。有两个下载版本,一个是spring-framework-1.2.5-with-dependencies.zip,一个是spring-framework-1.2.5.zip,with-dependencies的包括一些ant、jakarta-commons、struts、velocity等等其它开源Java项目的相依文件,如果您也需要这些相关文件,可以下载这个版本,如果您已经有这些相关文件,则只需要下载spring-framework-1.2.5.zip这个文件。,3,下载zip文件并解压缩之后,在dist目录下就是使用Spring所需要的相关文件,如果下载的是with-dependencies版本,则在lib目录中的是您可能会用到的相依文件。在dist目录下,spring-core.jar是Spring的核心,如果日后需要使用到Spring其它的子框架支持,再将其它的jar文件加入即可,例如spring-aop.jar、spring-webmvc.jar等等。您也可以直接使用spring.jar这个文件,它包括了所有Spring支持的功能所需要的所有类别,而不再需要加入个别的jar文件。注意在Spring1.2之后,原先于spring-core.jar中与Bean相关的一些组件,现在已移至spring-beans.jar中。,4,就这边接下来要练习的第一个Spring程序,要将spring-core.jar、spring-beans.jar,以及相依的commons-logging.jar加至Classpath的路径中,您可以在lib目录的jakarta-commons目录中找到。来编写您的第一个组件(Component),它只是一个简单的JavaBean,用来向使用者打声招呼:,5,publicclassHelloBeanprivateStringhelloWord;publicvoidsetHelloWord(StringhelloWord)this.helloWord=helloWord;publicStringgetHelloWord()returnhelloWord;,6,稍后您可以通过setHelloWord()这个Setter来设定新的招呼语,不过并不是亲自编写程序来作这些事,而是在配置文件定义,由Spring来为您作设定的动作,接着可以编写Bean的定义文件,定义文件会告诉Spring容器,如何完成相依对象的关系注入等动作,Bean定义档的名称可以自由定义,例如这边取名为beans-config.xml:,7,Hello!HHP!,8,定义文件中定义了JavaBean的别名与来源类别,标签中设定了希望注入至JavaBean的字符串值,编写一个简单的示范程序:SpringDemo.javapublicclassSpringDemopublicstaticvoidmain(Stringargs)Resourcers=newFileSystemResource(beans-config.xml);BeanFactoryfactory=newXmlBeanFactory(rs);HelloBeanhello=(HelloBean)factory.getBean(helloBean);System.out.println(hello.getHelloWord();,9,BeanFactory是Factory模式的一个实例,但用途更为一般,可以建立、管理不同型态的对象,由于这边所使用的Bean定义文件是XML,所以使用实例BeanFactory接口的XmlBeanFactory来作为管理Bean的实际对象,在Spring1.2中,XmlBeanFactory只接受实作Resource接口的对象,像是ClassPathResource、FileSystemResource、InputStreamResource、ServletContextResource、UrlResource等,分别表示不同的文件来源对象,这边所使用的是FileSystemResource,表示指定相对路径或绝对路径来取得Bean定义文件,同样的,如果您的Bean定义文件是位于Classpath路径中,您也可以使用ClasspPathResource来取得定义文件。,10,这是从比较低层次的角度来使用Spring的IoC容器功能,藉由BeanFactory来读取配置文件并完成依赖的关联注入,这边的依赖是什么?指的是HelloBean相依于String对象,通过Setter所保留的接口,使用Setterinjection来完成这个依赖注入,而不是将招呼语写死在HelloBean,BeanFactory是整个Spring的重点所在,整个Spring的核心都围绕着它,在这边使用的是XmlBeanFactory,负责读取XML配置文件,您也可以使用properties文件,这之后会再介绍。,11,BeanFactory读取Bean的组态设定并完成关系维护之后,可以藉由getBean()方法并指定Bean的别名来取得Bean实例,如果使用BeanFactory的话,只有在真正需要Bean对象时,才会实际建立Bean实例,而不是在一开始建立BeanFactory时就建立Bean实例,来看看实际运行之后的效果。,12,如果今天您要想改变招呼语,则只要更改beans-config.xml就可以了,不用修改主要的程序,从比较一般的角度来看,就意味着如果您想要改变一些对象之间的依赖关系,则只要修改配置文件即可,而不用修改组件的任何一行程序BeanFactory负责读取Bean定义文件,管理对象的加载、生成,对象之间的关系维护,负责Bean的生命周期,对于简单的应用程序来说,使用BeanFactory就已经足够,但是若要利用到Spring在框架上的一些功能以及进阶的容器功能,则可以使用ApplicationContext,BeanFactory则通常用于一些资源有限的装置,像是行动设备。,13,ApplicationContext的基本功能与BeanFactory很相似,它也负责读取Bean定义文件,维护Bean之间的关系等,然而ApplicationContext提供的一个应用程序所需的更完整的框架功能:ApplicationContext提供取得资源文件更方便的方法。ApplicationContext提供文字信息解析的方法,并支持国际化(Internationalization,I18N)信息。ApplicationContext可以发布事件,对事件感兴趣的Bean可以接收到这些事件。,14,RodJohnson建议使用ApplicationContext来取代BeanFactory,在许多实例ApplicationContext的类别中,最常使用的大概是以下三个:FileSystemXmlApplicationContext可指定XML定义文件的相对路径或绝对路径来读取定义文件。ClassPathXmlApplicationContext从Classpath中来读取XML定义文件。XmlWebApplicationContext在Web应用程序中的配置文件架构中读取定义文件。,15,举个例子来说,可以将第一个Spring程序中的测试程序修改为以下的内容:SpringDemo.javaimportorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassSpringDemopublicstaticvoidmain(Stringargs)ApplicationContextcontext=newFileSystemXmlApplicationContext(beans-config.xml);HelloBeanhello=(HelloBean)context.getBean(helloBean);System.out.println(hello.getHelloWord();,16,为了能编译与执行以上的程序,您必须将spring-context.jar加入至Classpath的设定中。ApplicationContext继承自多个层次:ApplicationEventPublisher、HierarchicalBeanFactory、ListableBeanFactory、MessageSource、ResourceLoader,相关的接口与使用说明,在往后的主题会一一介绍,17,18,BeanFactory、ApplicationContext,在第一个Spring程序中利用Bean的Setter完成依赖注入,Spring鼓励的是Setterinjection,也就是Type2,但也允许您使用Type3的Constructorinjection,使用Setter或Constructor来注入依赖关系视您的需求而定,这边先来看看如何使用Constructorinjection,首先看看HelloBean:,19,publicclassHelloBeanprivateStringname;privateStringhelloWord;publicHelloBean()publicHelloBean(Stringname,StringhelloWord)=name;this.helloWord=helloWord;publicvoidsetName(Stringname)=name;publicStringgetName()returnname;publicvoidsetHelloWord(StringhelloWord)this.helloWord=helloWord;publicStringgetHelloWord()returnhelloWord;,20,注意构造函数的两个参数顺序,在Bean定义文件中设定时必须指定参数的顺序,如下所示:beans-config.xmlHhpzhangyan,21,在Bean的定义文件中,使用来表示将使用Constructorinjection,由于使用Constructorinjection时并不如Setterinjection时拥有setXXX()这样易懂的名称,所以必须指定参数的位置索引,index属性就是用于指定对象将注入至构造函数中的哪一个参数,参数的顺序指定中,第一个参数的索引值是0,第二个是1,依此类推。,22,来看看测试程序:SpringDemo.javaimportorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassSpringDemopublicstaticvoidmain(Stringargs)ApplicationContextcontext=newFileSystemXmlApplicationContext(beans-config.xml);HelloBeanhello=(HelloBean)context.getBean(helloBean);System.out.print(name:);System.out.println(hello.getName();System.out.print(word:);System.out.println(hello.getHelloWord();,23,这边的例子在Bean上使用具有两个参数的构造函数作范例,如果构造函数上只有一个参数,则不必指定index属性,例如构造函数上若只有一个name参数,则可以在Bean定义文档中如下设定:.Hhp.,24,另一个例子是若有两个以上的参数,而参数型态各不相同的话,例如若HelloBean是这么定义的:HelloBean.javapublicclassHelloBeanprivateStringname;privateIntegerage;publicHelloBean()publicHelloBean(Stringname,Integerage)=name;this.age=age;publicvoidsetName(Stringname)=name;publicStringgetName()returnname;publicvoidsetAge(Integerage)this.age=age;publicIntegergetAge()returnage;,25,这次在Bean定义文件的上,可以使用type来指定构造函数上的参数类型,例如:beans-config.xmlHhp20,26,简单的将SpringDemo类别改为以下:SpringDemo.javaimportorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassSpringDemopublicstaticvoidmain(Stringargs)ApplicationContextcontext=newFileSystemXmlApplicationContext(beans-config.xml);HelloBeanhello=(HelloBean)context.getBean(helloBean);System.out.print(name:);System.out.println(hello.getName();System.out.print(word:);System.out.println(hello.getAge();,27,至于要使用Constructor或Setter来完成依赖注入这个问题,其实就等于在讨论一个古老的问题,要在对象建立时就准备好所有的资源,或是在对象建立好后,使用Setter来进行设定。使用Constructor的好处之一是,您可以在建构对象的同时一并完成依赖关系的建立,对象一建立则所有的一切也就准备好了,但如果要建立的对象关系很多,使用Constructorinjection会在建构函式上留下一长串的参数,且不易记忆,这时使用Setter会是个不错的选择,另一方面,Setter可以有明确的名称可以了解注入的对象会是什么,像是setXXX()这样的名称会比记忆Constructor上某个参数位置代表某个对象来得好。然而使用Setter由于提供了setXXX()方法,所以不能保证相关的数据成员或资源在执行时期不会被更改设定,所以如果您想要让一些数据成员或资源变为只读或是私有,使用Constructorinjection会是个简单的选择。,28,属性参考,在定义Bean时,除了直接指定值给属性值之外,还可以直接参考定义文件中的其它Bean,例如HelloBean是这样的话:HelloBean.javaimportjava.util.Date;publicclassHelloBeanprivateStringhelloWord;privateDatedate;publicvoidsetHelloWord(StringhelloWord)this.helloWord=helloWord;publicStringgetHelloWord()returnhelloWord;publicvoidsetDate(Datedate)this.date=date;publicDategetDate()returndate;,29,在以下的Bean定义文件中,先定义了一个dateBean,之后helloBean可以直接参考至dateBean,Spring会帮我们完成这个依赖关系:beans-config.xmlHello!,30,直接指定值或是使用直接指定参考至其它的Bean,编写以下的程序来测试Bean的依赖关系是否完成:SpringDemo.javaimportorg.springframework.context.ApplicationContext;importorg.springframework.context.support.FileSystemXmlApplicationContext;publicclassSpringDemopublicstaticvoidmain(Stringargs)ApplicationContextcontext=newFileSystemXmlApplicationContext(beans-config.xml);HelloBeanhello=(HelloBean)context.getBean(helloBean);System.out.print(hello.getHelloWord();System.out.print(Its);System.out.print(hello.getDate();System.out.println(.);,31,事实上,您也可以用内部Bean的方式来注入依赖关系,例如beans-config.xml可以改为以下:beans-config.xmlHello!,32,自动绑定,直接指定值或是使用直接指定参考至其它的Bean,Spring也支持隐式的自动绑定,您可以透过类型(byType)或名称(byName)将Bean绑定至其它Bean上对应的属性,下面是个byType的例子:beans-config.xmlHello!,33,在定义文件中,并没有指定helloBean的Date属性,而是通过自动绑定,由于autowire指定了byType,所以会根据helloBean的Date属性所接受的类型,判断是否有类似的型态对象,并将之绑定至helloBean的Date属性上,如果byType无法完成绑定,则丢出org.springrframework.beans.factory.UnsatisfiedDependencyExcpetion例外。,34,您也可以指定byName来绑定,则Spring会根据bean的别名与属性名称是否符合来进行自动绑定,举个例子来说,如果是byName而Date属性要完成依赖注入的话,则必须修改一下第一个Bean的id值为date:beans-config.xmlHello!,35,如果byName无法完成绑定,则属性维持未绑定状态。在构造方法上,也可以尝试进行自动绑定,例如若HelloBean.java修改如下:HelloBean.javapublicclassHelloBeanprivateStringhelloWord;privateDatedate;publicHelloBean()publicHelloBean(Datedate)this.date=date;publicvoidsetHelloWord(StringhelloWord)this.helloWord=helloWord;publicStringgetHelloWord()returnhelloWord;publicvoidsetDate(Datedate)this.date=date;publicDategetDate()returndate;,36,您可以如下定义beans-config.xml:beans-config.xmlHello!,37,由于autowire设定为constructor,在建立绑定关系时,Spring容器会试图比对容器中的Bean及相关的构造方法,在类型上是否有符合,如果有的话,则选用该构造方法来建立Bean实例,例如上例中,HelloBean的带参数建构方法与date这个Bean的类型相符,于是选用该构造方法来构造实例,并将date这个Bean注入给它,如果无法完成绑定,则丢出org.springframework.beans.factory.UnsatisfiedDependencyException例外。,38,还想再偷懒的话。就使用autodetect,例如:beans-config.xmlHello!,39,使用autodetect时,会尝试使用constructor,然后使用byType,哪一个先符合就先用。隐式的自动绑定没办法从定义档中,清楚的看到是否每个属性都完成设定,我们可以加入相依检查,在上加入dependency-check,有四种相依检查方式:simple、objects、all、none。第一个只检查简单的属性,像是原生(primitive)数据类型或字符串对象,objects检查对象属性,all则检查全部的属性,none是预设,表示不检查相依性,例如:,40,beans-config.xmlHello!如果相依检查发现有未完成的依赖关系,则运行时会丢出org.springframework.beans.factory.UnsatisfiedDependencyException,41,集合对象注入,对于像数组、java.util.List、java.util.Set、java.util.Map等集合对象,在注入前必须填充入一些对象至集合中,然后再将集合对象注入至所需的Bean中,例如若有个Bean如下:publicclassSomeBeanprivateStringsomeStrArray;privateSomeObjsomeObjArray;privateListsomeList;privateMapsomeMap;.,42,对于这个需求,Spring也可以帮您维护,直接来看Bean定义档如何设定:.Hello!Justin!Hello!Momor!Hello!Bush!Hello!Justin!Hello!Justin!,43,上面的Bean定义文件是个综合示范,数组与List对象都是用标签来设定,而Map对象使用标签设定,并需要一个key值设定。Set的使用标签,例如:asetelement,44,您也可以注入java.util.Properties,Bean定义档的写法示范如下:.someProValue1someProValue2,45,Bean的生命周期,在Spring中,从BeanFactory或ApplicationContext取得的实例为Singleton,预设是每一个Bean别名维持一个实例,对单线程的程序来说并不会有什么问题,但对于多线程的程序,您必须注意到线程安全,您也可以设定每次取得Bean时都产生一个新的实例,例如:singleton属性预设是true,藉由将其设定为false,每次取得Bean时都会产生一个新的实例。,46,一个Bean从建立到销毁,会历经几个执行阶段,如果是使用BeanFactory来管理Bean的话:Bean的建立由BeanFactory读取Bean定义档,并生成各个Bean实例。属性注入执行相关的Bean属性依赖注入。BeanNameAware的setBeanName()如果Bean类别有实作org.springframework.beans.factory.BeanNameAware接口,则执
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 宿舍电器火灾事故防范
- 虚拟现实金融模拟交易创新创业项目商业计划书
- 水产品安全检测技术升级创新创业项目商业计划书
- 2025西安浐灞第三初级中学招聘考试模拟试题及答案解析
- 2025-2030肉牛活体抵押贷款业务创新与农村金融改革试点研究报告
- 2025-2030肉牛养殖场环境智能监控系统开发及预警模型构建报告
- 2026届湖北省恩施州利川市九年级英语第一学期期末检测试题含解析
- 2025-2030绿色建筑背景下钢材应用技术发展趋势报告
- 2025-2030线上武术教学平台发展现状及市场机遇分析报告
- 2025-2030精准营养定制化服务市场培育与数字化解决方案投资前景分析
- 劳动课种植教学方案
- 2024年全国职业院校技能大赛高职组(环境检测与监测赛项)考试题库(含答案)
- 实验-大肠杆菌感受态细胞的制备及转化
- 2025年中考语文阅读复习:理解词语含义(含练习题及答案)
- GB/T 44421-2024矫形器配置服务规范
- 磷酸哌嗪宝塔糖的毒理学研究
- 【课件】2025届高三生物一轮复习备考策略研讨
- 灵芝培训课件
- 环形开挖预留核心土法
- 妇科医生进修汇报课件
- 《科室管理方案》课件
评论
0/150
提交评论