在ⅹML文件中定义的Bean是被消极加载的,这意味在需要bean之前, bean本身不会被初始化。要从 Bean Factory检索bean,只需调用 getBean()方 法,传入将要检索的bean的名称即可,如清单2所示 清单2. get Bean( My Bean mybean=(My Bean) factory. get Bean("mybean"); 每个bean的定义都可以是POJO(用类名和 Javabean初始化属性定义) 或 Factory Bean Factory Bean接口为使用 Spring框架构建的应用程序添加 个间接的级别 IOC示例 理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring系列的第1部分进行总结时,我使用了一个示例,演示了如何通过 Spring loc容器注入应用程序的依赖关系(而不是将它们构建进来) 我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用 户与以下服务进行交互: ☆信用级别评定服务,查询用户的信用历史信息。 ☆远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连 接起来,以进行自动借记(如果需要的话)。 ☆电子邮件服务,向用户发送有关信用卡状态的电子邮件。 三个接口 对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它 们集成在一起。以下清单显示了三个服务的应用程序接口 清单3. CreditRatingInterface public interface Credit RatingInterface i public boolean getUser CreditHistoryInformation(CUstomer cUstomer) 清单3所示的信用级别评定接口提供了信用历史信息。它需要一个包含客 户信息的 Customer对象。该接口的实现是由 CreditRating类提供的。 清单4. CreditLinkinglnterface
在 XML 文件中定义的 Bean 是被消极加载的,这意味在需要 bean 之前, bean 本身不会被初始化。要从 BeanFactory 检索 bean,只需调用 getBean() 方 法,传入将要检索的 bean 的名称即可,如清单 2 所示。 清单 2. getBean() MyBean mybean = (MyBean) factory.getBean("mybean"); 每个 bean 的定义都可以是 POJO (用类名和 JavaBean 初始化属性定义) 或 FactoryBean。FactoryBean 接口为使用 Spring 框架构建的应用程序添加了一 个间接的级别。 IOC 示例 理解控制反转最简单的方式就是看它的实际应用。在对由三部分组成的 Spring 系列 的第 1 部分进行总结时,我使用了一个示例,演示了如何通过 Spring IOC 容器注入应用程序的依赖关系(而不是将它们构建进来)。 我用开启在线信用帐户的用例作为起点。对于该实现,开启信用帐户要求用 户与以下服务进行交互: ☆ 信用级别评定服务,查询用户的信用历史信息。 ☆ 远程信息链接服务,插入客户信息,将客户信息与信用卡和银行信息连 接起来,以进行自动借记(如果需要的话)。 ☆ 电子邮件服务,向用户发送有关信用卡状态的电子邮件。 三个接口 对于这个示例,我假设服务已经存在,理想的情况是用松散耦合的方式把它 们集成在一起。以下清单显示了三个服务的应用程序接口。 清单 3. CreditRatingInterface public interface CreditRatingInterface { public boolean getUserCreditHistoryInformation(ICustomer iCustomer); } 清单 3 所示的信用级别评定接口提供了信用历史信息。它需要一个包含客 户信息的 Customer 对象。该接口的实现是由 CreditRating 类提供的。 清单 4. CreditLinkingInterface
public interface CreditLinkingInterface ublic String getUrlO public void setUrl(String url) public void link Credit BankAccountO throws Exception 信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并 插入用户的信用卡信息。信用链接接口是一个远程服务,它的查询是通过 getLo 方法进行的。URL由 Spring框架的bean配置机制设置,我稍后会讨论它。该 接口的实现是由 CreditLinking类提供的 清单5 EmailInterface public interface EmailInterface i public void send Email(CUstomer cUstomer) public String getFrom Email: public void setFrom Email(String from Email) public String getPasswordo; public void setPassword(String password) public String getSmtpHostO public void setSmtpHost( String smtp Host); public String getUserldo public void set Userid( String userid) 三、 Spring和数据库框架的整合 Spring框架提供了对 Hibernate、JDO和 IBATIS SQL Maps的集成支持。 Spring 对 Hibernate的支持是第一级的,整合了许多IOC的方便特性,解决了许多典 型的 Hibernate集成问题。框架对 Hibernate的支持符合 Spring通用的事务和 数据访问对象(DAO)异常层次结构 Spring为使用选择的OR映射层来创建数据访问应用程序提供了支持。因 为所有东西都设计成一组可重用 Javabean,所以不管选择什么技术,都能以库 的格式访问大多数 Spring的OR映射支持。 Application Context或 Bean Factory内部的OR映射的好处是简化了配置和部署 31 spring与 hibernate整合
public interface CreditLinkingInterface { public String getUrl(); public void setUrl(String url); public void linkCreditBankAccount() throws Exception ; } 信用链接接口将信用历史信息与银行信息(如果需要的话)连接在一起,并 插入用户的信用卡信息。信用链接接口是一个远程服务,它的查询是通过 getUrl() 方法进行的。URL 由 Spring 框架的 bean 配置机制设置,我稍后会讨论它。该 接口的实现是由 CreditLinking 类提供的。 清单 5. EmailInterface public interface EmailInterface { public void sendEmail(ICustomer iCustomer); public String getFromEmail(); public void setFromEmail(String fromEmail) ; public String getPassword(); public void setPassword(String password) ; public String getSmtpHost() ; public void setSmtpHost(String smtpHost); public String getUserId() ; public void setUserId(String userId); } 三、 Spring 和数据库框架的整合 Spring 框架提供了对 Hibernate、JDO 和 iBATIS SQL Maps 的集成支持。Spring 对 Hibernate 的支持是第一级的,整合了许多 IOC 的方便特性,解决了许多典 型的 Hibernate 集成问题。框架对 Hibernate 的支持符合 Spring 通用的事务和 数据访问对象(DAO)异常层次结构。 Spring 为使用选择的 OR 映射层来创建数据访问应用程序提供了支持。因 为所有东西都设计成一组可重用 JavaBean,所以不管选择什么技术,都能以库 的格式访问大多数 Spring 的 OR 映射支持。 ApplicationContext 或 BeanFactory 内部的 OR 映射的好处是简化了配置和部署。 3.1 spring 与 hibernate 整合
Hibernate是Java平台上一个功能全面的、开源的OR映射框架。 Hibernate 支持开发符合常规Java理念的持久性类 包括关联、继承、多态、复合以 及Java集合框架。 Hibernate查询语言(HQL)被设计成SQL的一个微型面 向对象扩展,它是对象和关系世界之间的桥梁。 Hibernate也支持用原始SQL或 基于Java的标准和示例査询表达查询。 Hibernate使用XML(* hbm. xml)文 件把Java类映射到表,把 Javabean属性映射到数据库表。 通过JDBC技术,支持所有的SQL数据库管理系。 Hibernate与所有流行 的』2EE应用程序服务器和web容器都很好地集成。 实际示例 个银行应用程序示例可以让您自己看到 Spring AOP和 Hibernate一起 工作有多么好。银行帐户用例允许用户( Customer)在一个事务中打开一个或 多个银行帐户。用户可以申请多个银行帐户,可以选择是支票帐户类型或者是储 蓄帐户类型 应用程序数据库( Cloudscape?)容纳所有客户和帐户信息。在这个例子中, 假设在 Customer和 Account类之间存在N的关联。在实际生活场景中,关 联可能需要按mn建模,才能支持联合帐户。 由于用户必须可以在一个事务中申请多个帐户,所以首先要为数据库交互实 现一个DOA模式。然后要设置 Spring AOP的 Transaction Proxy Factory Bean, 让它拦截方法调用并声明性地把事务上下文应用到DOA 四、 Struts和 Spring的区别 作者:0461108刘芳 4 STruts介绍 从视图角度(View) 主要由JSP建立, struts自身包含了一组可扩展的自定义标签库( TagLib), 可以简化创建用户界面的过程。目前包括: Bean Tags, HTML Tags, Logic tags, Nested Tags, Template Tags这几个 Taglib. 从模型角度( Model) 模型主要是表示一个系统的状态(有时候,改变系统状态的业务逻辑操作也 也划分到模型中)。在 Struts中,系统的状态主要有 ActiomForm Bean体现, 般情况下,这些状态是非持久性的。如果需要将这些状态转化为持久性数据存储 Struts本身也提供了 Title包,可以方便的与数据库操作 从控制器角度( Controller) 在 Struts framework中, Controller主要是 Action Servlet,但是对于业 务逻辑的操作则主要由 Action、 ActionMapping、 Action Forward这几个组件协 调完成(也许这几个组件,应该划分到模型中的业务逻辑一块)。其中, Actior
Hibernate 是 Java 平台上一个功能全面的、开源的 OR 映射框架。Hibernate 支持开发符合常规 Java 理念的持久性类 —— 包括关联、继承、多态、复合以 及 Java 集合框架。Hibernate 查询语言(HQL)被设计成 SQL 的一个微型面 向对象扩展,它是对象和关系世界之间的桥梁。Hibernate 也支持用原始 SQL 或 基于 Java 的标准和示例查询表达查询。Hibernate 使用 XML(*.hbm.xml) 文 件把 Java 类映射到表,把 JavaBean 属性映射到数据库表。 通过 JDBC 技术,支持所有的 SQL 数据库管理系。Hibernate 与所有流行 的 J2EE 应用程序服务器和 Web 容器都很好地集成。 实际示例 一个银行应用程序示例可以让您自己看到 Spring AOP 和 Hibernate 一起 工作有多么好。银行帐户用例允许用户 (Customer) 在一个事务中打开一个或 多个银行帐户。用户可以申请多个银行帐户,可以选择是支票帐户类型或者是储 蓄帐户类型。 应用程序数据库(Cloudscape?)容纳所有客户和帐户信息。在这个例子中, 假设在 Customer 和 Account 类之间存在 1:N 的关联。在实际生活场景中,关 联可能需要按 m:n 建模,才能支持联合帐户。 由于用户必须可以在一个事务中申请多个帐户,所以首先要为数据库交互实 现一个 DOA 模式。然后要设置 Spring AOP 的 TransactionProxyFactoryBean, 让它拦截方法调用并声明性地把事务上下文应用到 DOA。 四、 Struts 和 Spring 的区别 作者:0461108 刘芳 4.1Struts 介绍: 从视图角度(View) 主要由 JSP 建立,struts 自身包含了一组可扩展的自定义标签库(TagLib), 可以简化创建用户界面的过程。目前包括:Bean Tags,HTML Tags,Logic Tags, Nested Tags,Template Tags 这几个 Taglib。 从模型角度(Model) 模型主要是表示一个系统的状态(有时候,改变系统状态的业务逻辑操作也 也划分到模型中)。在 Struts 中,系统的状态主要有 ActiomForm Bean 体现,一 般情况下,这些状态是非持久性的。如果需要将这些状态转化为持久性数据存储, Struts 本身也提供了 Utitle 包,可以方便的与数据库操作 从控制器角度(Controller) 在 Struts framework 中, Controller 主要是 ActionServlet,但是对于业 务逻辑的操作则主要由 Action、ActionMapping、ActionForward 这几个组件协 调完成(也许这几个组件,应该划分到模型中的业务逻辑一块)。其中,Action
扮演了真正的业务逻辑的实现者,而 ActionMapping和 Action Forward则指定了 不同业务逻辑或流程的运行方向。 42 Spring介绍 轻量,从大小与开销两方面而言 Spring都是轻量的。完整的 Spring框架可以在 大小只有1MB多的JAR文件里发布。并且 Spring所需的处理开销也是微不足道 的。此外, Spring是非侵入式的:典型地, Spring应用中的对象不依赖于 Spring 的特定类。 2、控制反转, Spring通过一种称作控制反转(IoC)的技术促进了松耦合。当应 用了IoC,对象被动地传递它们的依赖而不是自己创建或者査找依赖对象。你可 以认为IoC与JNDI相反,不是对象从容器中査找依赖,而是容器在对象初始化时 不等被请求就将依赖传递给它。 3、面向切面. Spring包含对面向切面编程的丰富支持,允许通过分离应用的业 务逻辑与系统服务(例如审计与事物管理)进行内聚性的开发。应用对象只做它 们应该做的”完成业务逻辑”仅此而已。它们并不负责(甚至是意识)其它的系 统关注点,例如日志或事物支持。 4、容器. Spring包含和管理应用对象的配置和生命周期,在这个意义上它是 种容器。你可以配置你的每个bean如何被创建??基于一个配置原形为你的bean 创建一个单独的实例或者每次需要时都生成一个新的实例以及它们是如何相互 关联的。然而, Spring不应该被混同于传统的重量的EJB容器,它们经常是庞 大与笨重的,难以使用 4.3 Struts VS Spring struts缺点是比较重,页面(V)上要有form要用标签,form(M)要继承 Action Form 这么个东西,控制类(C)继承 Action/ DispatchAction Spring,页面标签用 jst1, model也不用继承什么,控制类继承 MultiAction Controller/SimpleFormController 在页面输入数据绑定上, struts用的是 ActionForm的自动绑定, Spring的是在 controller中声明 command对象。 在实现输入验证上 struts在form(M)上做文章要继承 ValidateForr, Sprit 都在 action上做文章。 Spring比较特殊,它是编程式的验证;而 struts都是 配置式的验证 各自优缺点:1、 Struts优点:业界“标准”(很多成功案例),学习资源丰 富,HIML标签非常优秀缺点: ActionForms使用不便、无法进行单元测试 ( StrutsTestcase只能用于集成)2、 Spring mvc优点: Lifecyle for overriding binding, validation,etc.;易于同其它View框架( Titles等) 无缝集成,采用I0C便于测试缺点:使用人数少、jsp中要写很多代码、控制器 过于灵活,缺少一个公用控制器
扮演了真正的业务逻辑的实现者,而 ActionMapping 和 ActionForward 则指定了 不同业务逻辑或流程的运行方向。 4.2 Spring 介绍: 轻量,从大小与开销两方面而言 Spring 都是轻量的。完整的 Spring 框架可以在 一 大小只有 1MB 多的 JAR 文件里发布。并且 Spring 所需的处理开销也是微不足道 的。此外,Spring 是非侵入式的:典型地,Spring 应用中的对象不依赖于 Spring 的特定类。 2、控制反转,Spring 通过一种称作控制反转(IoC)的技术促进了松耦合。当应 用了 IoC,对象被动地传递它们的依赖而不是自己创建或者查找依赖对象。你可 以认为 IoC 与 JNDI 相反,不是对象从容器中查找依赖,而是容器在对象初始化时 不等被请求就将依赖传递给它。 3、面向切面.Spring 包含对面向切面编程的丰富支持,允许通过分离应用的业 务逻辑与系统服务(例如审计与事物管理)进行内聚性的开发。应用对象只做它 们应该做的”完成业务逻辑”仅此而已。它们并不负责(甚至是意识)其它的系 统关注点,例如日志或事物支持。 4、容器.Spring 包含和管理应用对象的配置和生命周期,在这个意义上它是一 种容器。你可以配置你的每个 bean 如何被创建??基于一个配置原形为你的 bean 创建一个单独的实例或者每次需要时都生成一个新的实例以及它们是如何相互 关联的。然而,Spring 不应该被混同于传统的重量的 EJB 容器,它们经常是庞 大与笨重的,难以使用。 4.3 Struts VS Spring: struts缺点是比较重,页面(V)上要有 form要用标签,form(M)要继承 ActionForm 这么个东西,控制类(C)继承 Action/DispatchAction。Spring,页面标签用 jstl , model 也不用继承什么,控制类继承 MultiActionController/SimpleFormController。 在页面输入数据绑定上,struts 用的是 ActionForm 的自动绑定,Spring 的是在 controller 中声明 command 对象。 在实现输入验证上 struts 在 form(M)上做文章要继承 ValidateForm, Spring 都在 action 上做文章。Spring 比较特殊,它是编程式的验证;而 struts 都是 配置式的验证 各自优缺点: 1、 Struts 优点:业界“标准”(很多成功案例),学习资源丰 富,HTML 标签非常优秀缺点:ActionForms 使用不便、无法进行单元测试 ( StrutsTestCase 只能用于集成) 2、 Spring MVC 优点:Lifecyle for overriding binding, validation, etc.;易于同其它 View 框架(Titles 等) 无缝集成,采用 IOC 便于测试缺点:使用人数少、jsp 中要写很多代码、控制器 过于灵活,缺少一个公用控制器
4.4 Struts&spring 整合 与 Struts相似, Spring可以作为一个MvC实现。这两种框架都具有自己的优 点和缺点,尽管大部分人同意 Struts在MvC方面仍然是最好的。很多开发团 队已经学会在时间紧迫的时候利用 Struts作为构造高品质软件的基础 Struts具有如此大的推动力,以至于开发团队宁愿整合 Spring框架的特性, 而不愿意转换成 Spring mvc。没必要进行转换对您来说是一个好消息。 Spring架构允许您将 Struts作为Web框架连接到基于 Spring的业务和持 久层。最后的结果就是现在一切条件都具备了, 窍门1.使用 Spring的 Action Support 手动创建一个 Spring环境是一种整合 Struts和 Spring的最直观的方式。为了使 它变得更简单, Spring提供了一些帮助。为了方便地获得 Spring环境, org. springframework.web. struts. ActionSupport类提供了一个 getWebApplication Contexto方法。您所做的只是从 Spring的 Action Support而不是 Struts action类扩展您的动作,如清单1所示 清单1.使用 Action Support整合 Struts package ca. nExcel books actions import java. io IOException import javax. servlet Servletexception importjavax.servlethttpHttpservletrequEst importjavax.servlethttpHttpservletrespOnse import org. apache. struts action. actionError import org. apache. struts action. ActionErrors import org. apache struts action. action Form import org. apache. struts action. ActionForward import org. apache struts action Action Mapping import org. apache struts action. DynaActionForm import org. springframework context. ApplicationContext
4.4 Struts&Spring 整合: 与 Struts 相似,Spring 可以作为一个 MVC 实现。这两种框架都具有自己的优 点和缺点,尽管大部分人同意 Struts 在 MVC 方面仍然是最好的。很多开发团 队已经学会在时间紧迫的时候利用 Struts 作为构造高品质软件的基础。 Struts 具有如此大的推动力,以至于开发团队宁愿整合 Spring 框架的特性, 而不愿意转换成 Spring MVC。没必要进行转换对您来说是一个好消息。 Spring 架构允许您将 Struts 作为 Web 框架连接到基于 Spring 的业务和持 久层。最后的结果就是现在一切条件都具备了。 窍门 1. 使用 Spring 的 ActionSupport 手动创建一个 Spring 环境是一种整合 Struts 和 Spring 的最直观的方式。为了使 它变得更简单,Spring 提供了一些帮助。为了方便地获得 Spring 环境, org.springframework.web.struts.ActionSupport 类提供了一个 getWebApplicationContext() 方法。您所做的只是从 Spring 的 ActionSupport 而不是 Struts Action 类扩展您的动作,如清单 1 所示: 清单 1. 使用 ActionSupport 整合 Struts package ca.nExcel.books.actions; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.struts.action.ActionError; import org.apache.struts.action.ActionErrors; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.DynaActionForm; import org.springframework.context.ApplicationContext;