1、Spring框架高级开发工程师培训框架高级开发工程师培训中程在线(北京)内部教程注意保密第1章 Spring 框架概述学习内容学习内容 Spring 框架的历史 Spring 框架是介绍 第一个Spring实例 IoC和DI概念 DI的类型Spring Spring 框架的历史框架的历史 2002年11月一本名为Expert One-on-One J2EE Design and Development 2004年7月Rod Johnson又出版了另外一本名为Expert One on one J2EE Development Without EJBSpring Spring 框架是什么?框架是
2、什么?Spring Spring 框架给我们带来什么?框架给我们带来什么?IoCIoC和和DIDI,Spring通过IoC(控制反转)和DI(依赖注入)真正实现了面向接口的编程,使我们能够构建松耦合的J2EE企业级系统。灵活可选择灵活可选择,Spring不是一个强制性框架,你可以使用它的一部分也可以使用的全部。你也可以只使用它的AOP部分管理应用系统的事务,也可以只使用它MVC框架。Spring Web MVC Spring Web MVC 框架框架,Spring 提供的Web MVC 框架是一个非常优秀的Web MVC 框架,它即能够使用传统的JSP、HTML等作为视图技术,也可以使用PDF
3、和Excel作为视图技术,这样我们就可以实现Web报表的功能。Spring Spring 框架给我们带来什么?框架给我们带来什么?测试驱动测试驱动,Spring测试驱动模式的开发,什么是测试驱动呢?简单的说测试驱动就是,在编写某个被测试程序之前先编写测试程序,用测试程序测试目标程序,直到最后测试用例全部通过为止。这种编程方式将成为主流。灵活的事务支持灵活的事务支持,Spring提供了安全和灵活的事务支持,它即有编程型事务的支持又有声明型事务的支持。这里的声明型事务的支持是借助AOP实现的。消除各式各样的配置文件消除各式各样的配置文件,Spring提供了统一格式的配置文件,消除了一个框架一种形式
4、的配置文件问题,如Spring在整合Hibernate后就不再使用Hibernate的配置文件(Hibenate.cfg.xml或这是Hibernate.properties)SpringSpring的第一次亲密接触的第一次亲密接触 准备工作 建立工程 程序描述 测试程序 小结准备工作准备工作 到spring官方站点下载spring 框架 我们会看到两个压缩文件:spring-framework-2.x.zip和spring-framework-2.x-with-dependencies.zip建立工程建立工程 我们要在Eclipse中为第一个程序创建一个工程,这个工程名“FirstSprin
5、g”,它是一个普通的Java工程。添加Spring框架类库。程序描述程序描述 HelloWorld为例,现在我们要做一个Hello类,有一个方法是sayHello方法的返回值是一个字符串测试程序测试程序 没有使用Spring的JUnit4单元测试 有使用Spring的JUnit4单元测试没有使用没有使用SpringSpring的的JUnit4JUnit4单元测试单元测试使用使用SpringSpring的的JUnit4JUnit4单元测试单元测试applicationContext.xmlapplicationContext.xml小结小结 测试程序中将获得Hello实例的方式由原来的hello
6、=new Hello()hello=new Hello()的方法修改成为hello=hello=(Hello)bf.getBean(“myhello”)(Hello)bf.getBean(“myhello”)。Spring使用一个BeanFactory类获得Hello实例,BeanFactory类的子类ClassPathXmlApplicationContextClassPathXmlApplicationContext可以使Spring以类路径的方式访问它的applicationContext.xml文件,获得hello这个Bean注册信息,创建这个Bean的实例。什么什么IoCIoC和和D
7、IDI DI概念 IoC概念案例回顾案例回顾 设计一个接口Hello,它有一个sayHello方法这个代码如清单1.7所示。Hello接口的两个实现类即EnglishHello和ChineseHello。EnglishHello的sayHello方法是实现英文问候(“Hello World”)代码如清单1.8所示,ChineseHello的sayHello方法是实现中文问候(“世界你好”)代码如清单1.9所示。测试测试 为了测试EnglishHello和ChineseHello两个实现类。如果先测试的是EnglishHello这个类,修改Bean注册applicationContext.xml
8、文件,class的类型是com.tongking.spring.EnglishHello。在我们的JUnit单元测试程序HelloTest中我们不需要修改什么,如果我们的测试需求变了改成要测试ChineseHello这个类,我们只需要将applicationContext.xml文件中的Bean依赖关系修改成ChineseHello就可以了。案例总结案例总结 原本HelloTest测试类依赖于EnglishHello对象如图1.25,现在依赖于ChineseHello对象了如图1.26所示。什么是依赖关系?在OOAD的理论中对象之间有一种关系叫依赖关系。依赖关系就是一个对象B的变化会引起外一个
9、对象A的变化,我们就说A对象依赖于B对象(A-B)。如图1.27所示。依赖关系在OOAD里是普遍存在的。实例化对象方式实例化对象方式 SpringSpring的方式和的方式和newnew方式。方式。Spring的方式创建一个Bean实例,可以轻松的改变对象之间的依赖关系 new Hello()方式不能轻松的修改依赖关系,我们必须修改测试代码由hello=new EnglishHello()改为hello=new ChineseHello()。new的方式建立依赖关系是在编程时期建立的,而Spring方式是在运行期由Spring的BeanFactory从文件applicationContext.
10、xml读取依赖关系的,并动态实例化的。或者说依赖关系动态的由BeanFactory读取applicationContext.xml文件注入进来的这就是DI(Dependency Injection),我们翻译为“依赖注入”。接下来我们介绍什么是DI(“依赖注入”)。DIDI概念概念 DI是Dependency Injection缩写,我们翻译为“依赖注入”。简单的说,两个对象A-B(或者组件)依赖关系的建立,最好不要在编程时候确定下来,即不要通过new的方式确定依赖关系,这种方式会使系统失去可扩展性、可复用性等特点。Spring框架是多个Bean通过DI方式建立依赖关系,建立复杂的依赖关系网,
11、如图1.29所示。IoCIoC概念概念 IoC是Inversion of Control,翻译过来就是“控制反转”。IoC就是:原来由A来决定创建B还是创建C的权力发生了反转,变成了由框架决定创建B还是创建C,再由框架把B或C的实例对象赋予给A。这就是IoC“控制反转”。没有控制反转情况 控制反转情况 “控制反转”是符合“好莱坞原则”的,什么是“好莱坞原则”呢?就是“Dont call me,Ill call you.”,翻译过来“如果需要我会给你打电话,你不要给我打电话”。我给它改了一下叫做“中国式找工作原则”。总而言之,“控制反转”就是将控制权倒置,从而使软件系统发生了具有可扩展性、可复用
12、性等特性的飞跃,这个设计原则在OOAD中非常有用。DI“依赖注入”是IoC“控制反转”的一种特例。Spring是一个IoC框架,更准确的说是一个DI框架DIDI的类型的类型 Spring提供两种主要的DI方式:Setter(设值)注入方式 Constructor(构造器)注入方式 为了介绍这两种注入方式,我们先对我们上一节的Hello示例进行改造。为接口Hello添加另外一个实现类DbHello,DbHello类又依赖于另外的一个接口DictionaryDAO,类DictionaryDAOImp是接口DictionaryDAO实现类。设值注入方式设值注入方式 如果我们采用设值注入方式,改造后的类图如图1.32所示。构造器注入方式构造器注入方式 如果我们采用构造器依赖注入方式,那么改造后的类图如图1.33所示。