三大框架的底层机制及原理讲课讲稿.doc
Good is good, but better carries it.精益求精,善益求善。三大框架的底层机制及原理-Struts1的工作原理Struts1工作原理图: 1、初始化:struts框架的总控制器ActionServlet是一个Servlet,它在web.xml中配置成自动启动的Servlet,在启动时总控制器会读取配置文件(struts-config.xml)的配置信息,为struts中不同的模块初始化相应的对象。(面向对象思想)2、发送请求:用户提交表单或通过URL向WEB服务器提交请求,请求的数据用HTTP协议传给web服务器。3、form填充:struts的总控制器ActionServlet在用户提交请求时将数据放到对应的form对象中的成员变量中。4、派发请求:控制器根据配置信息对象ActionConfig将请求派发到具体的Action,对应的formBean一并传给这个Action中的excute()方法。5、处理业务:Action一般只包含一个excute()方法,它负责执行相应的业务逻辑(调用其它的业务模块)完毕后返回一个ActionForward对象。服务器通过ActionForward对象进行转发工作。6、返回响应:Action将业务处理的不同结果返回一个目标响应对象给总控制器。7、查找响应:总控制器根据Action处理业务返回的目标响应对象,找到对应的资源对象,一般情况下为jsp页面。8、响应用户:目标响应对象将结果传递给资源对象,将结果展现给用户。ssh框架启动流程 系统从职责上分为四层:表示层、业务逻辑层、数据持久层和域模块层。其中使用Struts作为系统的整体基础架构,负责MVC的分离,在Struts框架的模型部分,利用Hibernate框架对持久层提供支持,业务层用Spring支持。具体做法是:用面向对象的分析方法根据需求提出一些模型,将这些模型实现为基本的Java对象,然后编写基本的DAO接口,并给出Hibernate的DAO实现,采用Hibernate架构实现的DAO类来实现Java类与数据库之间的转换和访问,最后由Spring完成业务逻辑。系统的基本业务流程是:在表示层中,首先通过JSP页面实现交互界面,负责传送请求(Request)和接收响应(Response),然后Struts根据配置文件(struts-config.xml)将ActionServlet接收到的Request委派给相应的Action处理。在业务层中,管理服务组件的SpringIoC容器负责向Action提供业务模型(Model)组件和该组件的协作对象数据处理(DAO)组件完成业务逻辑,并提供事务处理、缓冲池等容器组件以提升系统性能和保证数据的完整性。而在持久层中,则依赖于Hibernate的对象化映射和数据库交互,处理DAO组件请求的数据,并返回处理结果。采用上述开发模型,不仅实现了视图、控制器与模型的彻底分离,而且还实现了业务逻辑层与持久层的分离。这样无论前端如何变化,模型层只需很少的改动,并且数据库的变化也不会对前端有所影响,大大提高了系统的可复用性。而且由于不同层之间耦合度小,有利于团队成员并行工作,大大提高了开发效率。Struts1与struts2有什么不同1.Action类Stuts1要求Action类继承一个抽象基类。Struts1的一个普通问题是使用抽象类编程而不是接口。Struts2Action类可以实现一个Action接口,也可以实现其它接口,使可选和定制的服务成为可能。Struts2提供一个ActionSupport基类去实现常用的接口。Action接口不是必须的,任何有execute标识的POJO对象都可以用作Struts2的Action对象。2.线程模式:Struts1nAction是单例模式并且必须是线程安全的,因为仅有Action的一个实例来处理所有的请求。单例策略限制了Struts1Action能作的事,并且要在开发时特别小心。Action资源必须是线程安全的或同步的。Struts2Action对象为每一个请求产生一个实例,因此没有线程安全问题。3.Servlet依赖:Struts1Action依赖于ServletAPI,因为当一个Action被调用时,HttpServletResquest和HttpServletResponse被传递给execute方法,即Action依赖了容器,测试变得非常麻烦。Struts2Action不依赖于容器,允许Action脱离容器单独被测试。如果需要,Struts2Action仍然可以访问初始的request和response。但是,其它的元素减少或者消除了直接访问HttpServletRequset和HttpServletResponse的必要性。4.捕获输入:Struts1使用ActionForm对象捕获输入。所有的ActionForm必须继承一个基类。因为其它JavaBean不能用作ActionForm,开发者经常创建多余的类捕获输入。动态Bean可以作为创建传统ActionForm的选择,但是,开发者可能是在重新描述已经存在的JavaBean,仍然会导致有冗余的javabean。Struts2直接使用Action属性作为输入属性,消除了对第二输入对象的需求。Action属性能够通过web页面上的taglibs访问。Struts2也支持ActionForm模式。(Struts2用普通的POJO来接收数据)5.表达式语言:Struts1整合了JSTL,但对集合和索引属性的支持很弱。Struts2可以是使用JSTL,但是也支持一个更加强大和灵活的表达式语言“ObjectGraphNotationLanguage”(OGNL).6.绑定值到页面(view):Struts1使用标准JSP机制把对象绑定到页面中来访问,Struts1要传递值的时候必须往request里放、往session里放,然后再传递到jsp里面,铜鼓el表达式得到。Struts2使用“ValueStack”技术,使taglib能够访问值而不需要把你的页面和对象绑定起来。ValueStack策略允许通过一系列名称相同但类型不同的属性重用页面。值栈技术非常著名。不需要request、不需要session,直接从Action中取值。7.类型转换:Struts1ActionForm属性通常都是String类型。Struts1使用Commons-Beanutils进行类型转换。每个类一个转换器,对每一个实例来说是不可配置的。Struts2使用OGNL进行类型转换。提供基本和常用对象的转换器。8.校验:Struts1支持在ActionForm的validate方法中手动校验,或者通过CommonsValidator的扩展来校验。同一个类可以有不同的校验内容,但不能校验子对象。Struts2支持通过validate方法和Xwork校验框架来进行校验。Xwork校验框架使用为属性类类型定义的校验和内容校验,来支持chain校验子属性。9.Action执行的控制:Struts1支持每一个模块有单独的RequestProcessors(生命周期),但是模块中的所有Action必须共享相同的生命周期。(服务器重启时,Action生命周期结束,即生命周期无法控制)。Struts2支持通过拦截器堆栈(InterceptornStacks)为每一个Action创建不同的生命周期。堆栈能够根据需要和不同的Action一起使用。(可以控制Action的生命周期)简单的说:struts1和struts2的核心原理不同:struts1.X是基于servlet的struts2是xwork的变体:他的核心是filterstruts1是单例模式开发,struts2是多例模式。struts1的单力模式好处是节省内存,缺点是并发性查,非同步。struts2好处是线程安全是同步的每次使用开辟新的内存空间,缺点是占用资源多。Model1的原理:Struts1的工作原理:图2它引入了"控制器"这个概念,控制器一般由servlet来担任,客户端的请求不再直接送给一个处理业务逻辑的JSP页面,而是送给这个控制器,再由控制器根据具体的请求调用不同的事务逻辑,并将处理结果返回到合适的页面。因此,这个servlet控制器为应用程序提供了一个进行前-后端处理的中枢。一方面为输入数据的验证、身份认证、日志及实现国际化编程提供了一个合适的切入点;另一方面也提供了将业务逻辑从JSP文件剥离的可能。业务逻辑从JSP页面分离后,JSP文件蜕变成一个单纯完成显示任务的东西,这就是常说的View。而独立出来的事务逻辑变成人们常说的Model,再加上控制器Control本身,就构成了MVC模式。实践证明,MVC模式为大型程序的开发及维护提供了巨大的便利。其实,MVC开始并不是为Web应用程序提出的模式,传统的MVC要求M将其状态变化通报给V,但由于Web浏览器工作在典型的拉模式而非推模式,很难做到这一点。因此有些人又将用于Web应用的MVC称之为MVC2。正如上面所提到的MVC是一种模式,当然可以有各种不同的具体实现,包括您自己就可以实现一个体现MVC思想的程序框架,Struts就是一种具体实现MVC2的程序框架。它的大致结构如图三所示:图三图三基本勾勒出了一个基于Struts的应用程序的结构,从左到右,分别是其表示层(view)、控制层(controller)、和模型层(Model)。其表示层使用Struts标签库构建。来自客户的所有需要通过框架的请求统一由叫ActionServlet的servlet接收(ActionServletStruts已经为我们写好了,只要您应用没有什么特别的要求,它基本上都能满足您的要求),根据接收的请求参数和Struts配置(struts-config.xml)中ActionMapping,将请求送给合适的Action去处理,解决由谁做的问题,它们共同构成Struts的控制器。Action则是Struts应用中真正干活的组件,开发人员一般都要在这里耗费大量的时间,它解决的是做什么的问题,它通过调用需要的业务组件(模型)来完成应用的业务,业务组件解决的是如何做的问题,并将执行的结果返回一个代表所需的描绘响应的JSP(或Action)的ActionForward对象给ActionServlet以将响应呈现给客户。过程如图四所示:图四这里要特别说明一下的是:就是Action这个类,上面已经说到了它是Struts中真正干活的地方,也是值得我们高度关注的地方。可是,关于它到底是属于控制层还是属于模型层,存在两种不同的意见,一种认为它属于模型层,如:JSPWeb编程指南;另一些则认为它属于控制层如:ProgrammingJakartaStruts、MasteringJakartaStruts和StrutsKickStart等认为它是控制器的一部分,还有其他一些书如StrutsinAction也建议要避免将业务逻辑放在Action类中,也就是说,图3中Action后的括号中的内容应该从中移出,但实际中确有一些系统将比较简单的且不打算重用的业务逻辑放在Action中,所以在图中还是这样表示。显然,将业务对象从Action分离出来后有利于它的重用,同时也增强了应用程序的健壮性和设计的灵活性。因此,它实际上可以看作是Controller与Model的适配器,如果硬要把它归于那一部分,笔者更倾向于后一种看法,即它是Controller的一部分,换句话说,它不应该包含过多的业务逻辑,而应该只是简单地收集业务方法所需要的数据并传递给业务对象。实际上,它的主要职责是:·校验前提条件或者声明·调用需要的业务逻辑方法·检测或处理其他错误·路由控制到相关视图上面这样简单的描述,初学者可能会感到有些难以接受,下面举个比较具体的例子来进一步帮助我们理解。如:假设,我们做的是个电子商务程序,现在程序要完成的操作任务是提交定单并返回定单号给客户,这就是关于做什么的问题,应该由Action类完成,但具体怎么获得数据库连接,插入定单数据到数据库表中,又怎么从数据库表中取得这个定单号(一般是自增数据列的数据),这一系列复杂的问题,这都是解决怎么做的问题,则应该由一个(假设名为orderBo)业务对象即Model来完成。orderBo可能用一个返回整型值的名为submitOrder的方法来做这件事,Action则是先校验定单数据是否正确,以免常说的垃圾进垃圾出;如果正确则简单地调用orderBo的submitOrder方法来得到定单号;它还要处理在调用过程中可能出现任何错误;最后根据不同的情况返回不同的结果给客户。二、为什么要使用Struts框架既然本文的开始就说了,自己可以建这种框架,为什么要使用Struts呢?我想下面列举的这些理由是显而易见的:首先,它是建立在MVC这种公认的好的模式上的,Struts在M、V和C上都有涉及,但它主要是提供一个好的控制器和一套定制的标签库上,也就是说它的着力点在C和V上,因此,它天生就有MVC所带来的一系列优点,如:结构层次分明,高可重用性,增加了程序的健壮性和可伸缩性,便于开发与设计分工,提供集中统一的权限控制、校验、国际化、日志等等;其次,它是个开源项目得到了包括它的发明者CraigR.McClanahan在内的一些程序大师和高手持续而细心的呵护,并且经受了实战的检验,使其功能越来越强大,体系也日臻完善;最后,是它对其他技术和框架显示出很好的融合性。如,现在,它已经与tiles融为一体,可以展望,它很快就会与JSF等融会在一起。当然,和其他任何技术一样,它也不是十全十美的,如:它对类和一些属性、参数的命名显得有些随意,给使用带来一些不便;还有如Action类execute方法的只能接收一个ActionForm参数等。但瑕不掩瑜,这些没有影响它被广泛使用为什么使用Struts2?新版本的Struts2.0是struts的action架构和webwork的融合体.依照Struts2.0.1的发布公告,一些关键特性如下:l 设计简单:使用抽象类而不是接口是Struts1的一个设计上的问题,这已经在Struts2中得到了解决.在Struts2中绝大多数类都是基于接口的,并且它的绝大多数核心接口都是独立于HTTP的.Struts2的Action类是独立于框架的,可视为单纯的POJO.框架的组件都设法保持松耦合l 单纯的Action:Action都是单纯的POJO.任何含有execute()方法的java类都可以当作Action类来使用.甚至我们始终都不需要实现接口.反转控制会在开发Action类的时候得到介绍过,这能让Action中立于底层框架.l 不再使用ActionForm:ActionForm特性不再在Structs2中出现.简单的JavaBean即可对Action直接传递参数.不再需要全部使用String类型的参数.l 简单的测试:Struts2的Action是独立于HTTP并且中立于框架的.这使得Struts2的程序可以很容易的在没有模拟对象的情况下测试.l 巧妙的默认值:大多数配置元素都设有一个根据需要设定的默认值.甚至根据需要基于XML的默认配置文件都可以进行重写.l 改良的结果集:不像Struts1中的ActionForward,Struts2的结果集灵活的提供了多种类型的输出,事实上这促进了响应的准备工作.l 更好的标签特性:Struts2可以添加样式表驱动标记,这使我们创建相同的页面仅用更少的代码.Struts2的标签更有效而且是面向结果的.Struts2的标签标记可以通过修改基础样式表来修改.个别的标签标记可以通过编辑FreeMarker的模板来修改.JSP和FreeMarker都完全得到了支持.l 引入注释:在Struts2程序中,除了XML和Javaproperties配置文件外,Java5的注释也可以作为一种选择.注释使得XML的使用降至最低.l 有状态的Checkbox:Struts2中的checkbox不需要对false值进行特殊处理.l 快速开始:很多改变无需重启web容器即可实现.l 自定义控制器:Struts1可以自定义每一个模块的请求处理器,如果需要,Struts2可以自定义每一个Action的请求处理.l 易与Spring整合:Struts2的Action与Spring是友好的,只需添加Spring的beanl 轻巧的插件:Struts2可以通过添加一个Jar文件来进行扩展,不再需要手动配置!l 支持AJAX:AJAX主题对提升程序交互有着重要的意义.Struts2框架提供了一套标签来AJAX化你的程序甚至DOJO.AJAX特性包括:1. AJAX客户端验证.2. 支持远程表单提交.(同样适用于submit标签)3. 先进的div模板提供动态重载部份HTML4. 先进的模板提供远程加载和计算Javascript的能力.5. AJAX-only选项卡面板的实现6. 丰富的发布/订阅事件模型7. 自动交互完善标签深入全面阐释Struts2的方方面面一、Struts概述Struts是一个用来开发Model2应用程序的框架。这个框架可以提高开发工作的速度,因为它提供的下面这些功能解决了Web应用程序开发过程中的一些常见问题:· 对页面导航活动进行管理;· 对来自用户的输入数据进行合法性验证;· 统一的布局;· 可扩展性;· 国际化和本地化;· 支持Ajax技术。因为Struts是一个Model2框架,所以在使用Struts时还应该遵守以下几条不成文的规定。· 不要在JSP页面里嵌入Java代码,应该把所有的业务逻辑包含在一些被称为“动作类”(actionclass)的Java类里。· 在JSP页面里使用ExpressionLanguage(OGNL)去访问有关的模型对象。· 尽量避免编写自定义标签(因为自定义标签的代码比较难以编写)。二、升级到Struts2你也许用过Struts1编程,这里提供了一个关于Struts2新功能的简要介绍。· 在Struts1里需要使用一个像ActionServlet类这样的东西作为servlet控制器;Struct2使用了一个过滤器来完成同样的任务。· 在Struts2里没有任何动作表单。在Struts1里,每个HTML表单都对应着一个ActionForm实例,你可以从动作类访问这个动作表单,并用它来填充数据传输对象。在Struts2里,HTML表单将被直接映射为一个POJO,而不再需要你创建一个数据传输对象,因为没有动作表单,维护工作变得简单容易了,你不再需要与那么多的类打交道。· 问题来了:没有了动作表单,怎样才能在Struts2里通过编程对用户输入进行合法性验证呢?答案是把验证逻辑编写在动作类里。· Struts1通过几个标签库提供了一批定制标签供程序员在JSP页面里使用,其中最重要的是HTML标签库、Bean标签库和Logic标签库。Servlet2.4里的JSTL和EL(ExpressionLanguage,表达式语言)经常被用来代替Bean和Logic标签库。Struts2为程序员准备了一个应有尽有的标签库,你不再需要JSTL,但在某些场合你可能仍需要EL。· 在Struts1里,你还需要用到一些Struts配置文件,其中最主要的是存放在各Web应用程序里的WEB-INF子目录里的struts-config.xml(默认文件名)。在Struts2里,你仍需要用到多个配置文件,但必须把它们存放在WEB-INF/classes子目录或它的某个下级子目录里。· 要想使用Struts2,你的系统里必须有Java5和Servlet2.4(或更高版本)。之所以需要有Java5,是因为Java5里新增加的注解在Struts2里扮演着重要角色。我们撰写本书时,Java6已经发布,Java7也指日可待,你很可能已经在使用Java5或Java6了。· 在Struts1里,动作类必须扩展自org.apache.struts.action.Action类。在Struts2里,任何一个POJO都可以是一个动作类。不过,我们将在本书第3章说明,在Struts2里最好对ActionSupport类进行扩展。在此基础上,可用一个动作类来完成相关的动作。· Struts2在JSP页面里使用OGNL来显示各种对象模型,而不再是JSPEL和JSTL。原本是Struts1组件之一的Tiles现在已经发展为一个独立的ApacheHTTP没有“类型”的概念,在HTTP请求里发送的值都是字符串。在把表单字段映射到非String类型的动作属性时,Struts会自动对这些值进行必要的转换。这一章将解释Struts如何完成这类转换,你还将学到如何为更加复杂的情spring工作机制及为什么要用?1.springmvc请所有的请求都提交给DispatcherServlet,它会委托应用系统的其他模块负责负责对请求进行真正的处理工作。2.DispatcherServlet查询一个或多个HandlerMapping,找到处理请求的Controller.3.DispatcherServlet请请求提交到目标Controller4.Controller进行业务逻辑处理后,会返回一个ModelAndView5.Dispathcher查询一个或多个ViewResolver视图解析器,找到ModelAndView对象指定的视图对象6.视图对象负责渲染返回给客户端。为什么用:AOP让开发人员可以创建非行为性的关注点,称为横切关注点,并将它们插入到应用程序代码中。使用AOP后,公共服务(比如日志、持久性、事务等)就可以分解成方面并应用到域对象上,同时不会增加域对象的对象模型的复杂性。IOC允许创建一个可以构造对象的应用环境,然后向这些对象传递它们的协作对象。正如单词倒置所表明的,IOC就像反过来的JNDI。没有使用一堆抽象工厂、服务定位器、单元素(singleton)和直接构造(straightconstruction),每一个对象都是用其协作对象构造的。因此是由容器管理协作对象(collaborator)。Spring即使一个AOP框架,也是一IOC容器。Spring最好的地方是它有助于您替换对象。有了Spring,只要用JavaBean属性和配置文件加入依赖性(协作对象)。然后可以很容易地在需要时替换具有类似接口的协作对象。Spring框架是一个分层架构,由7个定义良好的模块组成。Spring模块构建在核心容器之上,核心容器定义了创建、配置和管理bean的方式,如图1所示。组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:核心容器:核心容器提供Spring框架的基本功能。核心容器的主要组件是BeanFactory,它是工厂模式的实现。BeanFactory使用控制反转(IOC)模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。Spring上下文:Spring上下文是一个配置文件,向Spring框架提供上下文信息。Spring上下文包括企业服务,例如JNDI、EJB、电子邮件、国际化、校验和调度功能。SpringAOP:通过配置管理特性,SpringAOP模块直接将面向方面的编程功能集成到了Spring框架中。所以,可以很容易地使Spring框架管理的任何对象支持AOP。SpringAOP模块为基于Spring的应用程序中的对象提供了事务管理服务。通过使用SpringAOP,不用依赖EJB组件,就可以将声明性事务管理集成到应用程序中。SpringDAO:JDBCDAO抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。SpringDAO的面向JDBC的异常遵从通用的DAO异常层次结构。SpringORM:Spring框架插入了若干个ORM框架,从而提供了ORM的对象关系工具,其中包括JDO、Hibernate和iBatisSQLMap。所有这些都遵从Spring的通用事务和DAO异常层次结构。SpringWeb模块:Web上下文模块建立在应用程序上下文模块之上,为基于Web的应用程序提供了上下文。所以,Spring框架支持与JakartaStruts的集成。Web模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。SpringMVC框架:MVC框架是一个全功能的构建Web应用程序的MVC实现。通过策略接口,MVC框架变成为高度可配置的,MVC容纳了大量视图技术,其中包括JSP、Velocity、Tiles、iText和POI。Spring框架的功能可以用在任何J2EE服务器中,大多数功能也适用于不受管理的环境。Spring的核心要点是:支持不绑定到特定J2EE服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同J2EE环境(Web或EJB)、独立应用程序、测试环境之间重用。共2页:12内容导航第1页:Hibernate工作原理及用的理由(1)第2页:Hibernate工作原理及用的理由(2)IOC和AOP控制反转模式(也称作依赖性介入)的基本概念是:不创建对象,但是描述创建它们的方式。在代码中不直接与对象和服务连接,但在配置文件中描述哪一个组件需要哪一项服务。容器(在Spring框架中是IOC容器)负责将这些联系在一起。在典型的IOC场景中,容器创建了所有对象,并设置必要的属性将它们连接在一起,决定什么时间调用方法。下表列出了IOC的一个实现模式。Spring框架的IOC容器采用类型2和类型3实现。面向方面的编程面向方面的编程,即AOP,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。AOP和IOC是补充性的技术,它们都运用模块化方式解决企业应用程序开发中的复杂问题。在典型的面向对象开发方式中,可能要将日志记录语句放在所有方法和Java类中才能实现日志功能。在AOP方式中,可以反过来将日志服务模块化,并以声明的方式将它们应用到需要日志的组件上。当然,优势就是Java类不需要知道日志服务的存在,也不需要考虑相关的代码。所以,用SpringAOP编写的应用程序代码是松散耦合的。AOP的功能完全集成到了Spring事务管理、日志和其他各种特性的上下文中。IOC容器Spring设计的核心是org.springframework.beans包,它的设计目标是与JavaBean组件一起使用。这个包通常不是由用户直接使用,而是由服务器将其用作其他多数功能的底层中介。下一个最高级抽象是BeanFactory接口,它是工厂设计模式的实现,允许通过名称创建和检索对象。BeanFactory也可以管理对象之间的关系。BeanFactory支持两个对象模型。单态模型提供了具有特定名称的对象的共享实例,可以在查询时对其进行检索。Singleton是默认的也是最常用的对象模型。对于无状态服务对象很理想。原型模型确保每次检索都会创建单独的对象。在每个用户都需要自己的对象时,原型模型最适合。bean工厂的概念是Spring作为IOC容器的基础。IOC将处理事情的责任从应用程序代码转移到框架。正如我将在下一个示例中演示的那样,Spring框架使用JavaBean属性和配置数据来指出必须设置的依赖关系。BeanFactory接口因为org.springframework.beans.factory.BeanFactory是一个简单接口,所以可以针对各种底层存储方法实现。最常用的BeanFactory定义是XmlBeanFactory,它根据XML文件中的定义装入bean,如清单1所示。清单1.XmlBeanFactoryBeanFactoryfactory=newXMLBeanFactory(newFileInputSteam("mybean.xml");在XML文件中定义的Bean是被消极加载的,这意味在需要bean之前,bean本身不会被初始化。要从BeanFactory检索bean,只需调用getBean()方法,传入将要检索的bean的名称即可,如清单2所示。清单2.getBean()MyBeanmybean=(MyBean)factory.getBean("mybean");每个bean的定义都可以是POJO(用类名和JavaBean初始化属性定义)或FactoryBean。FactoryBean接口为使用Spring框架构建的应用程序添加了一个间接的级别。IOC示例理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的Spring系列的第1部分进行总结时,我使用了一个示例,演示了如何通过SpringIOC容器注入应用程序的依赖关系(而不是将它们构建进来)。我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用户与以下服务进行交互:信用级别评定服务,查询用户的信用历史信息。远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连接起来,以进行自动借记(如果需要的话)。电子邮件服务,向用户发送有关信用卡状态的电子邮件。三个接口对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它们集成在一起。以下清单显示了三个服务的应用程序接口。清单3.CreditRatingInterfacepublicinterfaceCreditRatingInterfacepublicbooleangetUserCreditHistoryInformation(ICustomeriCustomer);清单3所示的信用级别评定接口提供了信用历史信息。它需要一个包含客户信息的Customer对象。该接口的实现是由CreditRating类提供的。清单4.CreditLinkingInterfacepublicinterfaceCreditLinkingInterfacepublicStringgetUrl();publicvoidsetUrl(Stringurl);publicvoidlinkCreditBankAccount()throwsException;信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并插入用户的信用卡信息。信用链接接口是一个远程服务,它的查询是通过getUrl()方法进行的。URL由Spring框架的bean配置机制设置,我稍后会讨论它。该接口的实现是由CreditLinking类提供的。清单5.EmailInterfacepublicinterfaceEmailInterfacepublicvoidsendEmail(ICustomeriCustomer);publicStringgetFromEmail();publicvoidsetFromEmail(StringfromEmail);publicStringgetPassword();publicvoidsetPassword(Stringpassword);publicStringgetSmtpHost();publicvoidsetSmtpHost(StringsmtpHost);publicStringgetUserId();publicvoidsetUserId(StringuserId);Hibernate工作原理及为什么要用?原理:1. 读取并解析配置文件2. 读取并解析映射信息,创建SessionFactory3. 打开Sesssion4. 创建事务Transation5. 持久化操作6. 提交事务7. 关闭Session8. 关闭SesstionFactory为什么要用:1. 对JDBC访问数据库的代码做了封装,大大简化了数据访问层繁琐的重复性代码。2. Hibernate是一个基于JDBC的主流持久化框架,是一个优秀的ORM实现。他很大程度的简化DAO层的编码工作3. hibernate使用Java反射机制,而不是字节码增强程序来实现透明性。4. hibernate的性能非常好,因为它是个轻量级框架。映射的灵活性很出色。它支持各种关系数据库,从一对一到多对多的各种复杂关系。2Hibernate是如何延迟加载?1. Hibernate2延迟加载实现:a)实体对象b)集合(Collection)2. Hibernate3提供了属性的延迟加载功能当Hibernate在查询数据的时候,数据并没有存在与内存中,当程序真正对数据的操作时,对象才存在与内存中,就实现了延迟加载,他节省了服务器的内存开销,从而提高了服务器的性能。3Hibernate中怎样实现类之间的关系?(如:一对多、多对多的关系)类与类之间的关系主要体现在表与表之间的关系进行操作,它们都市对对象进行操作,我们程序中把所有的表与类都映射在一起,它们通过配置文件中的many-to-one、one-to-many、many-to-many、4说下Hibernate的缓存机制1. 内部缓存存在Hibernate中又叫一级缓存,属于应用事物级缓存2. 二级缓存:a) 应用及缓存b) 分布式缓存条件:数据不会被第三方修改、数据大小在可接受范围、数据更新频率低、同一数据被系统频繁使用、非 关键数据c)第三方缓存的实现5Hibernate的查询方式Sql、Criteria,objectcomptositionHql:1、属性查询2、参数查询、命名参数查询3、关联查询4、分页查询5、统计函数6如何优化Hibernate?1. 使用双向一对多关联,不使用单向一对多2. 灵活使用单向一对多关联3. 不用一对一,用多对一取代4. 配置对象缓存,不使用集合缓存5. 一对多集合使用Bag,多对多集合使用Set6. 继承类使用显式多态7. 表字段要少,表关联不要怕多,有二级缓存撑腰7Struts工作机制?为什么要使用Struts?工作机制:Struts的工作流程:在web应用启动时就会加载初始化ActionServlet,ActionServlet从struts-config.xml文件中读取配置信息,把它们存放到各种配置对象当Act