ImageVerifierCode 换一换
格式:DOCX , 页数:16 ,大小:24.04KB ,
资源ID:8747001      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-8747001.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(Spring3开发实战 之 第二章IoCDI开发1.docx)为本站会员(b****6)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

Spring3开发实战 之 第二章IoCDI开发1.docx

1、Spring3开发实战 之 第二章IoCDI开发1IoCInversion of Control,控制反转在Java开发中,IoC意味着将你设计好的类交给系统去控制,而不是在你的类内部控制。IoC是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖的设计原则。DIDependency Injection(依赖注入)即组件之间的依赖关系由容器在运行期决定,形象的来说,即由容器动态的将某种依赖关系注入到组件之中。依赖注入的目标并非为软件系统带来更多的功能,而是为了提升组件重用的概率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任

2、何代码就可指定目标需要的资源, 完成自身的业务 逻辑,而不用关心具体的资源来自何处、由谁实现。1:控制反转:谁控制谁?控制什么?为何叫反转(对应于正向)?哪些方面反转了 ?为何需要反转?2:依赖:什么是依赖(按名词理解,按动词理解)?谁依赖于谁?为什么需要依赖?依赖什么东西?3:注入:谁注入于谁?注入什么东西?为何要注入?4:依赖注入和控制反转是同一概念吗?5:参与者都有哪些?6:IoC/DI是什么?能做什么?怎么做?用在什么地方?还不能完全回答和理解,没有关系,先来看看IoC/DI的基本思想演变,然后再回头来回答这些问题IoC容器简单的理解就是:实现IoC思想,并提供对象创建、对象装配以及对

3、象生命周期管理的软件就是IoC容器。IoC理解1:应用程序无需主动new对象;而是描述对象应该如何被创建即可IoC容器帮你创建,即被动实例化;2:应用程序不需要主动装配对象之间的依赖关系,而是描述需要哪个服务IoC容器会帮你装配(即负责将它们关联在一起),被动接受装配;3:主动变被动,体现好莱坞法则:别打电话给我们,我们会打给你4:体现迪米特法则(最少知识原则):应用程序不知道依赖的具体实现,只知道需要提供某类服务的对象(面向接口编程);并松散耦合,一个对象应当对其他对象有尽可能少的了解,不和陌生人(实现)说话5:是一种让服务消费者不直接依赖于服务提供者的组件设计方式,是一种减少类与类之间依赖

4、的设计原则。使用IoC/DI容器开发需要改变的思路1:应用程序不主动创建对象,但要描述创建它们的方式。2:在应用程序代码中不直接进行服务的装配,但要描述哪一个组件需要哪一项服务,由容器负责将这些装配在一起。也就是说:所有的组件都是被动的,组件初始化和装配都由容器负责,应用程序只是在获取相应的组件后,实现应用的功能即可。提醒一点IoC/DI是思想,不是纯实现技术。IoC是框架共性,只是控制权的转移,转移到框架,所以不能因为实现了IoC就叫IoC容器, 而一般除了实现了IoC外,还具有DI功能的才叫IoC容器,因为容器除了要负责创建并装配组件关系,还需要管理组件生命周期。n工具准备1:Eclips

5、e + Jdk6.0 ,示例用的Eclipse是Eclipse Java EE IDE for Web Developers,Version: Helios Service Release 12:spring-framework-3.1.0.M2-with-docs.zip构建环境1:在Eclipse里面新建一个工程,设若名称是Spring3test2:把发行包里面的dist下面的jar包都添加到Eclipse里面3:根据Spring的工程来获取Spring需要的依赖包,在联网的情况下,通过Ant运行projects/build-spring-framework/build.xml,会自动去下

6、载所需要的jar包,下载后的包位于projects/ivy-cache/repository下面。4:为了方便,把这些jar包也添加到Eclipse里面开发接口java代码: public interface HelloApi public String helloSpring3(int a); 开发实现类java代码: public class HelloImpl implements HelloApipublic String helloSpring3(int a)System.out.println(hello Spring3=+a);return Ok,a=+a;配置文件1:在src下

7、面新建一个文件叫applicationContext.xml2:在Spring发行包里面搜索一个例子,比如使用:projectsorg.springframework.contextsrctestjavaorgspringframeworkjmx下的applicationContext.xml,先把里面的配置都删掉,留下基本的xml定义和根元素就可以了,它是一个DTD版的,而且还是2.0版的。java代码: 3:建议使用Spring3的Schema版本,示例如下:4:配置applicationContext.xml如下:java代码: 编写客户端如下:java代码: package cn.ja

8、vass.Spring3.hello;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;public class Client public static void main(String args) ApplicationContext context = new ClassPathXmlApplicationContext( new String applicationContext.x

9、ml);HelloApi api = (HelloApi)context.getBean(helloBean);String s = api.helloSpring3(3);System.out.println(the s=+s);审视和结论1:所有代码中(除测试代码之外),并没有出现Spring的任何组件 。2:客户代码(这里就是我们的测试代码)仅仅面向接口编程,而无需知道实现类的具体名称。同时,我们可以很简单的通过修改配置文件来切换具体的底层实现类 。结论1:首先,我们的组件并不需要实现框架指定的接口,因此可以轻松的将组件从Spring脱离,甚至不需要任何修改(这在基于EJB架实现的应用中

10、是难以想象的)。2:其次,组件间的依赖关系减少,极大改善了代码的可重用性和可维护性3:面向接口编程什么是Spring中的Bean在Spring中,那些组成应用的主体及由Spring IoC容器所管理的对象被称之为bean。简单地讲,bean就是由Spring容器初始化、装配及被管理的对象,除此之外,bean就没有特别之处了(与应用中的其他对象没有什么区别)。而bean定义以及bean相互间的依赖关系将通过配置元数据来描述。为什么使用Bean这个名字使用bean这个名字而不是组件(component) 或对象(object)的动机源于Spring框架本身(部分原因则是相对于复杂的EJB而言的)。

11、Spring的IoC容器org.springframework.beans.factory.BeanFactory是Spring IoC容器的实际代表者,IoC容器负责容纳bean,并对bean进行管理。Spring IoC容器将读取配置元数据;并通过它对应用中各个对象进行实例化、配置以及组装。通常情况下我们使用简单直观的XML来作为配置元数据的描述格式。在XML配置元数据中我们可以对那些我们希望通过Spring IoC容器管理的bean进行定义。IoC/DI是Spring最核心的功能之一, Spring框架所提供的众多功能之所以能成为一个整体正是建立在IoC的基础之上BeanFactory和

12、ApplicationContextorg.springframework.beans及org.springframework.context包是Spring IoC容器的基础。BeanFactory提供的高级配置机制,使得管理任何性质的对象成为可能。 ApplicationContext是BeanFactory的扩展,功能得到了进一步增强,比如更易与Spring AOP集成、消息资源处理(国际化处理)、事件传递及各种不同应用层的context实现(如针对web应用的WebApplicationContext)。接口选择之惑在实际应用中,用户有时候不知道到底是选择BeanFactory接口还是

13、ApplicationContext接口。但是通常在构建JavaEE应用时,使用ApplicationContext将是更好的选择,因为它不仅提供了BeanFactory的所有特性,同时也允许使用更多的声明方式来得到我们想要的功能。简而言之,BeanFactory提供了配制框架及基本功能,而ApplicationContext则增加了更多支持企业核心内容的功能。ApplicationContext完全由BeanFactory扩展而来,因而BeanFactory所具备的能力和行为也适用于ApplicationContext。Spring IoC容器的实例化非常简单,如下面的例子:1:第一种:ja

14、va代码: Resource resource = new FileSystemResource(beans.xml);BeanFactory factory = new XmlBeanFactory(resource); 2:第二种:java代码: ClassPathResource resource = new ClassPathResource(beans.xml);BeanFactory factory = new XmlBeanFactory(resource); 3:第三种:java代码: ApplicationContext context = new ClassPathXmlA

15、pplicationContext( new String applicationContext.xml, applicationContext-part2.xml);/ of course, an ApplicationContext is just a BeanFactoryBeanFactory factory = (BeanFactory) context;读取多个配置文件第一种方法:为了加载多个XML文件生成一个ApplicationContext实例,可以将文件路径作为字符串数组传给ApplicationContext构造器。而bean factory将通过调用bean defin

16、tion reader从多个文件中读取bean定义。通常情况下,Spring团队倾向于上述做法,因为这样各个配置并不会查觉到它们与其他配置文件的组合。第二种方法:使用一个或多个的元素来从另外一个或多个文件加载bean定义。所有的元素必须放在元素之前以完成bean定义的导入。 让我们看个例子:java代码: 配置文件中常见的配置内容在IoC容器内部,bean的定义由BeanDefinition 对象来表示,该定义将包含以下信息:1:全限定类名:这通常就是已定义bean的实际实现类。如果通过调用static factory方法来实例化bean,而不是使用常规的构造器,那么类名称实际上就是工厂类的类

17、名。2:bean行为的定义,即创建模式(prototype还是singleton)、自动装配模式、依赖检查模式、初始化以及销毁方法。这些定义将决定bean在容器中的行为。3:用于创建bean实例的构造器参数及属性值。比如使用bean来定义连接池,可以通过属性或者构造参数指定连接数,以及连接池大小限制等。4:bean之间的关系,即协作 (或者称依赖)。Bean的命名每个bean都有一个或多个id(或称之为标识符或名称,在术语上可以理解成一回事),这些id在当前IoC容器中必须唯一。当然也可以为每个bean定义一个name,但是并不是必须的,如果没有指定,那么容器将为其生成一个惟一的name。对于

18、不指定name属性的原因我们会在后面介绍(比如内部bean就不需要)。Bean命名的约定bean的命名采用标准的Java命名约定,即小写字母开头,首字母大写间隔的命名方式。如accountManager、 accountService等等。对bean采用统一的命名约定将会使配置更加简单易懂。而且在使用Spring AOP,这种简单的命名方式将会令你受益匪浅。Bean的别名一个Bean要提供多个名称,可以通过alias属性来加以指定 ,示例如下:容器如何实例化Bean当采用XML描述配置元数据时,将通过元素的class属性来指定实例化对象的类型。class属性主要有两种用途:在大多数情况下,容器

19、将直接通过反射调用指定类的构造器来创建bean(这有点等类似于在Java代码中使用new操作符);在极少数情况下,容器将调用类的静态工厂方法来创建bean实例,class属性将用来指定实际具有静态工厂方法的类(至于调用静态工厂方法创建的对象类型是当前class还是其他的class则无关紧要)。用构造器来实例化Bean ,前面的实例就是使用静态工厂方法实例化采用静态工厂方法创建bean时,除了需要指定class属性外,还需要通过factory-method属性来指定创建bean实例的工厂方法,示例如下:使用实例工厂方法实例化使用此机制,class属性必须为空,而factory-bean属性必须指

20、定为当前(或其祖先)容器中包含工厂方法的bean的名称,而该工厂bean的工厂方法本身必须通过factory-method属性来设定,并且这个方法不能是静态的,示例如下:使用容器从本质上讲,BeanFactory仅仅只是一个维护bean定义以及相互依赖关系的高级工厂接口。使用getBean(String)方法就可以取得bean的实例;BeanFactory提供的方法极其简单。n依赖注入(DI)背后的基本原理是对象之间的依赖关系(即一起工作的其它对象)只会通过以下几种方式来实现:构造器的参数、工厂方法的参数,或给由构造函数或者工厂方法创建的对象设置属性。因此,容器的工作就是创建bean时注入那些

21、依赖关系。相对于由bean自己来控制其实例化、直接在构造器中指定依赖关系或则类似服务定位器(Service Locator)模式这3种自主控制依赖关系注入的方法来说,控制从根本上发生了倒转,这也正是控制反转IoC名字的由来。应用依赖注入(DI)的好处、应用DI原则后,代码将更加清晰。而且当bean自己不再担心对象之间的依赖关系(以及在何时何地指定这种依赖关系和依赖的实际类是什么)之后,实现更高层次的松耦合将易如反掌。依赖注入(DI)基本的实现方式DI主要有两种注入方式,即Setter注入和 构造器注入。通过调用无参构造器或无参static工厂方法实例化bean之后,调用该bean的setter

22、方法,即可实现基于setter的DI。 示例如下:示例Java类java代码: public class HelloImpl implements HelloApiprivate String name = ;public void setName(String name)this.name = name;public String helloSpring3(int a)System.out.println(hello Spring3=+a+,name=+name);return Ok,a=+a;示例配置文件javass Spring3示例Java类java代码: public class H

23、elloImpl implements HelloApiprivate String name = ;public HelloImpl(String name)this.name = name;public String helloSpring3(int a)System.out.println(hello Spring3=+a+,name=+name);return Ok,a=+a;示例配置文件java代码: javass Spring3默认解析方式构造器参数将根据类型来进行匹配。如果bean定义中的构造器参数类型明确,那么bean定义中的参数顺序就是对应构造器参数的顺序构造器参数类型匹配可以使用type属性来显式的指定参数所对应的简单类型。例如:java代码: 构造器参数的索引使用index属性可以显式的指定构造器参数出现顺序。例如:java代码: 构造器参数的名称在Spring3里面,可以使用构造器参数的名称来直接赋值。例如:java代码: 直接量(基本类型、Strings类型等)元素通过字符串来指定属性或构造器参数的值。JavaBean属性编辑器将把字符串从java.lang.String类型转化为实际的属性或参数类型。示例:java代码: oracle.jdbc.driver.OracleDriverproperty name=

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2