




已阅读5页,还剩17页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第4章 Java EE框架集成(Spring框架的应用)一、主要内容: (1)IoC/依赖注入与Spring框架。 (2)Spring/Hibernate集成(与DAO彻底解耦)。 (3)Struts 2/Spring集成(旨在帮助管理Action)。 (4)Struts 2/Spring/Hibernate三者集成(经典SSH2方式)。二、重点(1)理解IOC的定义。(2)了解Spring框架的体系结构,包括Data Access(ORM框架+JDBC框架)/Integration(JMS)模块、Web模块(Spring MVC框架)、IOC模块、AOP模块()、工具集成模块(instrument)、Message消息协议支持模块(定义消息、消息处理、发送消息)。(3)理解Spring 框架的IOC容器原理(Bean的生命周期管理)和重要接口(BeanFactory和ApplicationContext)、Spring配置文件的基本结构。掌握设计Bean组件、通过Spring创建Bean组件(包括容器中Bean的作用域、Bean组件之间依赖关系的配置)、Bean组件的获取和使用。(4)Spring对数据访问层(DAO)的支持,包括对第三方ORM框架(Hibernate)的支持和JDBC(JdbcTemplate)支持。三、教学内容:1.IOCIOC 是Inverse of Control的简称,也称为控制反转,它是一种设计模式。 IoC的思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源, 作为回应,容器适时的返回资源。而应用了IoC之后,则是【容器】主动地将资源推送给它所管理的【组件】, 组件所要做的仅是选择一种合适的方式来接受资源,这种行为也被称为查找的被动形式。因此,也把控制反转这种设计模式更直观称为DI(Dependency Injection,依赖注入),意思是由IOC框架或容器将被调用类注入给调用对象,以此来解除调用对象和被调用类之间的依赖关系。 以下面需求为例:某软件功能模块(Business)具有内容写入U盘(UsbDisk)功能。 图1 Business类与UsbDiskWriter关系图 代码描述:public class UsbDiskWriterpublic void save()/把内容存储到U盘中public class BusinessUsbDiskWriter writer;public Business()writer = new UsbDiskWriter();public void save()writer.save();假设客户要求软件功能支持内容保存到软盘(floppy),此时,我们发现由于Business类的构造方法依赖于类UsbDiskWriter,如果某天想要更换底层(被调用)类为FloppyWriter,则这个Business类没有办法重用,必须加以修改才行。修改后的类图如下图所示。图2 Business类与FloppyWriter关系图 代码描述:public class FloppyWriterpublic void save()/把内容存储到Floppy盘中public class BusinessFloppyWriter writer;public Business()writer = new FloppyWriter();public void save()writer.save();从图1、图2发现,底层类的改变(变为FloppyWriter)造成了高层类Business也必须改变(上段代码中加黑部分为改动部分),这不是一个好的设计。造成这种弊端的显著原因是,高层Business类依赖于底层类,如图3所示。图3 Business类与FloppyWriter、UsbDiskWriter关系图当然Business类违反了面向对象设计原则中的开-闭原则,即软件实体应对扩展开放,而对修改关闭。面向对象设计原则是设计模式的基础,每个设计模式都符合一个或者多各面向对象设计原则,使用设计原则提高可维护性和可复用性。表1-面向对象设计原则设计原则名称内容描述单一职责(Single Responsibility Principle,SRP)一个类只负责一个功能领域的相应职责开-闭(Open-Closed Principle,OCP)软件实体应对扩展开放,而对修改关闭里式替换(Liskov substitution Principle, LSP)引用所有基类的地方能透明底使用子类的对象依赖倒转(Dependence Inversion Principle ,DIP)抽象不应该依赖于具体,具体应该依赖于抽象接口隔离( Interface Segregation Principle ,ISP)使用多个专门接口,而不是使用单一的总接口合成复用原则(Composite Reuse Principle, CRP)尽量使用对象组合,而不是继承来达到复用的目的若要消除这种依赖,在设计上,可由底层UsbDiskWriter和FloppyWriter类抽象出一个接口IWriter,使Business类依赖于这个接口。重构后 UsbDiskWriter、FloppyWriter与Business关系如图4所示。图4 重构后UsbDiskWriter、FloppyWriter与Business 类关系图从图4中可以看出,原先的依赖关系发生了变化,如图所示,高层类Business不再依赖于底层(被调用)的类,而是依赖于接口。这种依赖关系的转移称为“反转依赖”,然而,仅仅只是依赖反转并不能彻底消除耦合,高层类仍在一定程度上受底层类的束缚。例如,某天需要将内容存储到Floppy或别的介质上,除了重新实现IWriter外,Business类还是要做出一点修改,FloppyWriter 代码如下:public class FloppyWriter implements IWriterpublic void save()/把内容保存在Floppy盘中public class Businessprivate IWriter writer;public Business()writer = new FloppyWriter();/修改的部分,构造接口实现类实例public void save()writer.save();public class Businessprivate IWriter writer;public Business( IWriter writer) this.writer=writer;public void save()writer.save();/定义UsbDiskWriter实现IWriter接口public class UsbDiskWriter implements IWriterpublic void save()/把内容保存在UsbDisk盘中public class Businessprivate IWriter writer;public Business()writer = new UsbDiskWriter ();/修改的部分,构造接口实现类实例public void save()writer.save();/定义存储功能接口public interface IWriterpublic void save();通过工厂模式构造写入实例。什么是工厂模式?Factory模式有3种变体:(1)简单工厂模式: 允许接口创建对象,但不会暴露对象的创建逻辑。(2)工厂方法模式:允许接口创建对象,但使用哪个类来创建对象,则是交由子类决定的。(3)抽象工厂模式:抽象工厂是一个能够创建一系列相关的对象而无需指定/公开其具体类的接口。该模式能够提供其他工厂的对象,在其内部创建其他对象。这里使用简单工厂可以帮助开发人员创建不同类型的对象,而不是直接将对象实例化。使用简单工厂模式后类的关系如图所示:图5 使用简单工厂模式重构后UsbDiskWriter、FloppyWriter与Business 类关系图代码如下:public class Businessprivate IWriter writer;public Business(String wname)writer = new WriterFactory().getWriter(wname);/从工厂获得public void save()writer.save();Public class WriterFactory Public IWriter getWriter(String wname) If(“UsbDiskWriter”.equals(wname) Return new UsbDiskWriter();else if(“FloppyWriter”.equals(wname) Return new FloppyWriter();else Throw new Exception(“找不到对应实现类”);2. SpringSpring框架是由世界著名的Java EE大师罗德约翰逊(Rod Johnson,如图所示)发明的。他在2002年编著的expert one-on-one J2EE Design and Development一书中,对Java EE正统EJB框架臃肿、低效、脱离现实的种种现状提出了质疑。(21 interface)2.1 体系结构Spring是一个开源框架,它的功能都是从实际开发中抽取出来的,完成了大量Java EE开发中的通用步骤。Spring框架的主要优势之一是其分层架构,整个框架由7个定义良好的模块(或组件)组成,它们都统一构建在核心容器之上,如图所示,分层架构允许用户选择使用任意一个组件。图2-1 Spring结构图由图2-1可以看出,Spring框架主要分为4大模块,包括核心容器模块(Core Container)、面向切面编程模块(AOP)、数据访问/集成模块(Data Access/Integration)和Web模块,其中每个模块包含若干个不同的组件。以下为每个模块的详细描述:1) 核心容器模块(Core Container):该模块作为Spring框架的核心模块,分别由Core(核心组件)、Beans(Bean定义)、Context(运行上下文)、Expression Language(表达式语言支持)组件构成,其中Core组件+Beans组件提供整个Spring框架基本功能,主要实现控制反转IoC和依赖注入DI、Bean配置以及加载。2) 面向切面编程模块(AOP):该模块提供基于代理的AOP支持和集成Aspects的AOP支持。使用面向切面编程模块(AOP)可以很容易地使 Spring 框架管理的任何对象支持AOP,比如为基于 Spring 的应用程序中的对象提供了事务管理服务。3) 数据访问/集成模块(Data Access/Integration):该模块分为数据访问模块、集成模块2部分,其中数据访问模块包括JDBC数据访问组件(比如:Spring内置提供的JDBC数据库访问组件JDBCTemplete)、 ORM(Object Relational Mapping)持久化组件、事务管理(Transaction)组件和 OXM(Object XML Mapping)java对象与XML映射组件;集成模块包含JMS(Java Message Service)。4) Web模块:该模块主要是整合Web框架,将Web框架也纳入Spring的管理之中,web框架可以是Spring框架本身自带web框架,比如Spring MVC框架;也可以是第三方web应用框架,比如struts2、XWork等框架。(3)Spring的优点Spring有以下优点:1)非侵入式设计,不强依赖Spring框架的系统API;2)轻量级,基于Spring框架的应用程序可以独立运行于各种应用服务器;3)Spring的DI机制降低了组件之间的耦合性 ,实现了软件各层之间的解耦;4)spring对于主流的应用框架(如hibernate、Struts等)提供了集成支持;5)Spring的AOP支持允许将系统服务(如安全、事务、日志)与业务逻辑分离,实现系统服务的集中式管理;6)Spring支持第三方持久层框架集成,并简化了底层的数据库访问。2.2 Spring IOC容器Spring容器有两个核心接口:BeanFactory和ApplicationContext,其中ApplicationContext是 BeanFactory的子接口,它们代表了Spring容器,Spring容器是产生Bean的工厂,用于管理容器中的Bean。Bean是Spring管理的基本单位,在Spring的Java EE应用中,所有的组件都是Bean。Bean可以是服务层对象(Service)、数据访问对象DAO、表示层对象如Action、Controller.工厂类如Hibernate的SessionFactory工厂对象等Q:在Spring中,BeanFactory与FactoryBean的区别? 2.2.1 BeanFactory接口即Bean工厂,由org.springframework.beans.factory.BeanFactory接口定义,是最简单的容器,提供了基础的依赖注入支持。接口定义(见表2-1):表2-1 BeanFactory接口定义方法说明public boolean containsBean(String name)判断Spring容器是否包含id为name的Bean定义public Object getBean(String name)返回容器id为name的Beanpublic Object getBean(String name,Class type)返回容器中id为name,并且类型为type的Beanpublic Class getType(String name)返回容器中id为name的Bean的类型在Spring中有几种BeanFactory的实现,其中最常使用的是org.springframework.bean. factory.xml. XmlBeanFactory。它根据xml文件中的定义装载Bean。要创建XmlBeanFactory,需要传递一个java.io.InputStream对象给构造函数。InputStream对象提供xml文件给工厂。例如,下面的代码片段使用一个java.io.FileInputStream对象把Bean xml定义文件给XmlBeanFactory:BeanFactory factory = new XmlBeanFactory(new FileInputStream(beans.xml);这行简单的代码告诉Bean工厂从beans.xml 文件中读取Bean的定义信息,但是现在Bean工厂并没有立即实例化Bean,只是把Bean的定义信息载入进来,Bean只有在需要的时候才被实例化。为了从BeanFactory得到一个Bean,只要简单地调用getBean()方法,把需要的Bean的名字作为参数传递进去即可,代码如下:MyBean myBean = (MyBean)factory.getBean(myBean); 2.2.2 ApplicationContext接口ApplicationContext和BeanFactory差不多。两者都是载入Bean定义信息,装配Bean,根据需要分发Bean。但是,ApplicationContext提供了更多的功能:(1)文本信息解析工具,包括对国际化的支持。(2) 载入文本资源的通用方法,如载入图片。(3) 可以向注册为监听器的Bean发送事件。如果应用程序中有多个属性配置文件,则应该采用BeanFactory的子接口ApplicationContext来创建BeanFactory的实例。ApplicationContext通常采用如下两个实现类实例化:1 ClassPathXmlApplicationContext。从类路径中的xml文件载入上下文定义信息,把上下文定义文件当成类路径资源。代码实现:ApplicationContext context = new ClassPathApplicationContext(applicationContext.xml);2 FileSystemXmlApplicationContext。从文件系统中的xml文件载入上下文定义信息。 代码实现:ApplicationContext context = new FileSystemXmlApplicationContext(file:xml文件绝对路径);3 XmlWebApplicationContext。从Web系统中的xml文件载入上下文定义信息。代码实现:ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(request.getSession(). getServletContext();区别:使用FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的区别是,FileSystemXmlApplicationContext只能在指定的路径中寻找xml文件,而ClassPathXmlApplication Context可以在整个类路径中寻找xml文件。3. Spring配置文件的结构Spring的XML格式的配置文件,在配置文件的开始需要引入Spring的语义约束。在Spring的安装发布包的schema目录可以找到相应的XML Schema语义约束文件,这些文件以.xsd结尾。 Spring配置文件的名称并不固定,可以任意命名,默认名称为applicationContext.xml。配置文件保存至项目的CLASSPATH路径下,即项目的src根目录下。配置文件中元素是根元素,在元素下可嵌套0或多个子元素,元素是配置Bean的核心元素,元素通常有两个属性:id和class。图3-1 Spring 文件结构3.1 元素的配置属性名称说明idBean在BeanFactory中的唯一标识。通过id,BeanFactory可以获取相应的BeanclassBean对应于的具体类名name等同于id,但在命名上name可使用“#”、“%”等特殊字符。相当于为Bean指定别名singleton指定Bean是否采用单例模式,默认为trueautowire指定Bean的属性装配方式,其值可以是no、byName、byType、Constructor、autodetectscope指定该Bean的作用域init-method指定该Bean的初始化方法detroy-method指定该Bean的销毁方法abstract指定该Bean是否为抽象的中,若为抽象的,则Spring不能为它创建实例parent指定该Bean的父类标识或别名,即父类的id或name属性值配置示例: org.hibernate.dialect.MySQLDialecttrue 3.2容器中Bean的作用域Spring还可以为Bean指定某种作用域,Spring提供了5种作用域:(1)singleton:单例模式,在Spring的容器中,如果Bean的作用域为singleton则在整个生命周期中只创建一个实例,默认情况下,Spring容器中的Bean都为单例模式。(2)prototype:原型模式,每次通过getBean方法获取的Bean都是一个新产生的Bean对象。(3)request:对于每次HTTP请求,使用request定义的Bean都会产生一个新实例。(4)session:对于每次HTTP 会话,使用session定义的Bean都会产生一个新实例。(5)global session:每个全局的HTTP会话对应于一个Bean实例。3.3 Bean的生命周期第一步:Bean的建立。第二步:属性注入。第三步:调用BeanNameAware的setBeanName()方法。第四步:调用BeanFactoryAware的setBeanFactory()方法。第五步:调用BeanPostProcessors的ProcessBeforeInitialization()方法。第六步:调用InitializingBean的afterPropertiesSet()方法。第七步:执行配置文件中定义的init-method属性。第八步:调用BeanPostProcessors的ProcessaAfterInitialization()方法。3.5 依赖注入方式Spring容器的工作就是创建Bean时注入这些依赖关系。相对于由Bean自己来控制其实例化,直接在构造方法中指定依赖关系或者类似服务定位器模式这三种自主控制依赖关系注入的方式来说,控制从根本上发生了倒转,这也正是控制反转名字的由来。依赖注入可通过以下几种方式来实现:Setter(设值)注入、Constructor(构造方法)注入和工厂方法注入。(1) Setter(设值)注入通过调用无参数构造函数或无参数static工厂方法实例化Bean之后,调用该Bean的setter方法,即可实现基于setter的依赖注入。public class Businessprivate IWriter writer;/默认的构造器public Business()/设值注入所需的setter方法public void setWriter(IWriter writer)this.writer = writer;public void save()writer.save();配置文件内容改动:在上面的类代码中,调用了IWriter接口的save()方法,但Business类并不知道它要调用的writer实例是如何实现的,也不知道writer实例在哪里,它只是需要使用一个IWriter接口的实现类,这个实现类将由Spring容器负责注入。(2) Constructor(构造方法)注入基于构造方法的依赖注入是通过调用带参数的构造方法为该类的属性初始化,其中,构造方法每个参数代表着一个依赖。public class Businessprivate IWriter writer;/默认的构造器public Business()/构造注入所需的带参数的构造器public Business(IWriter writer)this.writer = writer;public void save()writer.save();配置文件改动:3.6 基于注解的IoC自Spring 2.5开始,允许使用注解(Annotation)来代替XML格式的配置文件,从而简化Spring应用开发。Spring使用注解将一些Java类注册成Spring Bean,然后Spring通过指定的路径来搜索Java类,从而找到需要的Bean。Spirng提供了如
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 煤炭仓储物流项目环境影响报告书
- 木质家具生产线项目建筑工程方案
- 离婚双方关于房产、车辆及股权分割协议公证范本
- 电子商务平台知识产权保护与保密竞业限制全面协议
- 跨国能源合作:中石油国际油品购销合作协议
- 离婚简易协议书:财产分割与子女抚养权益协议
- 智能家居系统租赁合同提前终止及售后服务协议
- 竞业禁止协议赔偿金在教育培训行业的适用
- 保障性住房项目建筑设计与功能优化方案
- 2025年能源行业技术创新反垄断合规策略研究报告
- 2024年人教版九年级英语单词默写单(微调版)
- 2024年东南亚解热镇痛类原料药市场深度研究及预测报告
- 中建企业定额2023版
- 《计算机网络实验教程》全套教学课件
- 间隔记录数据表
- 工抵房转让协议
- 《民航客舱设备操作与管理》课件-项目四 飞机舱门及撤离滑梯
- DB32T4064-2021江苏省城镇燃气安全检查标准
- 人工智能领域合作协议
- 项目及其策划方案
- 宠物医疗行业招商策划
评论
0/150
提交评论