英语原文共 20 页,剩余内容已隐藏,支付完成后下载完整资料
题目:用Spring框架简化企业Java应用程序
本书的第一章讨论了Java EE应用程序架构和设计的基本原则。在本章中,我将展示这些概念如何应用于Spring框架。我将从Spring的简要概述和它作为应用程序框架的重要性开始。然后,我将介绍构成这个框架的构建块,在这个过程中,您将看到操作框架。在了解了Spring框架的基本原理之后,我将讨论它在企业Java应用程序体系结构和设计中的角色。最后,我将用Spring Java设计模式指令结束本章,该指令将在本书的下三章中使用。如果您对在本章中运行代码感兴趣,那么跳到第7章,它提供了关于在Spring框架插件中设置基于eclipse的ezJEE Studio的步骤说明。它还向您展示了如何创建需要开发和运行这些示例的示例项目结构。
1.Spring 是什么?
Spring框架是最初针对Java平台的开放源码应用程序框架。它最近也被移植到了.net平台上。这个框架的想法和代码最初是Rod Johnson在他的书《专家一对一J2EE设计和开发》中描述的(Wrox, 2002)。这一框架是罗德的广泛项目经验的结果,他是英国金融部门客户的独立软件顾问。
Spring框架目前在Apache 2.0开放源码许可下可用。它是一个高质量的软件产品,可以用来构建干净,灵活的企业级软件。这是通过在进展软件中使用Structure101进行的测试来证明的(http://www.headwaysoftware.com)。创始人兼首席执行官克里斯bull;Chedgey在这个博客(http://chris.headwaysoftware.com/2006/07/springs_structu.html)报道称,Spring框架代码没有包级别依赖周期“尽管其合理规模约70代码(从字节码估计)分为139包。”这充分说明了Spring框架的底层架构和设计。如果您对更多信息感兴趣,请参考http://www。springframework.org/node/310。
- 为什么Spring如此重要?
Java EE平台旨在解决与分布式应用程序开发相关的复杂性。传统的Java EE平台通过EJB、JTA和JMS等各种api实现了底层中间件服务的标准化,取得了巨大的成功。因为商业供应商和开源社区都聚集在一起,实现了基于标准Java的平台的巨大潜力。由于主要关注的是标准化系统服务,因此忽略了简化编程模型的基本问题。因此,尽管在20世纪90年代末和2000年初广泛采用,在Java EE平台上开发多层应用仍然需要付出很大的努力。
Java EE平台旨在基于组件模型构建应用程序。组件是一种自包含的代码,理想情况下可以在多个应用程序中重用。order组件可以包含一个实体bean来处理订单信息的持久性和一个会话bean,以便在order entityties上执行不同的工作流。理论上,这具有巨大的重用潜力。但是现实是不同的,因为在一个项目中开发的组件很少在另一个项目中再次使用。Java EE服务器特定的部署描述符也使得重用这些com-ponents变得困难。Java EE编程模型的复杂性还导致开发团队编写、测试和维护许多不必要的代码。这包括在JNDI树上查找EJB对象、检索数据库连接、准备和执行数据库查询以及最终释放所有数据库资源的样板代码。用于绕过实体bean API限制的数据传输对象严重违反了面向对象的封装原则。即使是中等规模的项目也有大量的转移对象来开发和维护。所有这些都导致资源的大量流失,否则这些资源只能用于开发良好的业务逻辑。
EJB的设计目的是帮助简化事务性和分布式应用程序的开发。即使最小的数据库驱动应用程序也需要传输,但它可能不需要分发。但是,过度使用EJB,特别是会话bean来简化业务逻辑,导致将分布构建到应用程序com-ponent模型中。分布式应用程序过于复杂,因此需要消耗更多的CPU周期来进行处理。它们导致了过多的重复代码和元数据。访问分布式应用程序组件需要网络遍历,并编组和解组大型数据集。分布式对象的错误使用常常导致即使是一个简单的应用程序也不能达到它所期望的水平。
Java EE包含了许多天生复杂的技术和api。例如,实体bean API需要一个显著的学习曲线,反过来又为应用程序提供了有限的好处。由于Java EE组件在应用程序服务器容器内运行,因此很难进行单元测试。这防止了测试驱动的开发(TDD)。
Java EE应用程序开发中的困难迫使开发交换性寻找替代方案。很快,在不同Java EE api之上构建的框架迅速扩散。例如,Apache Struts框架可以使用servlet API帮助实现MVC原则。该框架实现了一个基于servlet的前端控制器,并允许开发人员为简单的页面协调器提供实现。另一方面,Hibernate的出现是为了解决实体bean开发带来的巨大痛苦。它提供了具有最小配置元数据的pojo持久性。这些pojo不是像实体bean那样的分布式对象,因此导致了更好的应用程序性能。Hibernate不需要任何容器支持,因此很容易对这些持久性对象进行单元测试。然后还有HiveMind用于简单的基于pojo的业务服务。
Spring框架还开始解决与开发Java EE应用程序相关的复杂性。但是,与Struts、Hibernate或HiveMind等单层框架不同,Spring提供了一个全面的多层框架,可以在应用程序的所有层中使用。它帮助将整个应用程序与开箱即用的组件结合在一起,并集成了最好的单层框架。就像它的单层副本一样,它提供了基于pojo的简单编程模型,并使它们易于测试,因为这些组件可以在服务器容器之外运行。
控制(IOC)容器的Spring反转(下一节将讨论)是整个框架的核心。它可以将应用的不同部分粘合在一起,从而形成一个连贯的体系结构。Spring MVC组件可以用来构建一个非常灵活的web层。IOC容器使用pojo简化了业务层的开发。
这些POJO业务组件可以通过Spring提供的各种remoting选项提供给分布式对象。它们还可以用于开发和连接分布式EJB组件。使用Spring AOP,可以透明地将系统服务(如事务、安全性和工具)应用到POJO组件。Spring JDBC和对象关系映射(ORM)组件允许简化与数据库的交互。作为一个应用程序框架,Spring通过Java连接器体系结构(JCA)和web服务提供了与完全不同的信息系统的简单的基于标准的集成。最后,Spring security是一个全面的解决方案,以满足任何企业应用程序的安全需求。
Spring框架的构建块
Spring是一个应用程序框架,它分为几个模块或组件。每个模块提供一组指定的功能,或多或少地独立于其他模块。不用说,这些模块可以用来构建可伸缩但灵活的企业Java应用程序。这个系统非常灵活,因为开发人员可以选择只使用在问题上下文中最合适的模块。例如,开发人员可以只使用Spring DAO模块,并使用非Spring组件构建应用程序的其余部分。此外,Spring还提供了与其他框架和api协作的集成点。如果您认为Spring不适用于特定场景,那么您可以使用替代方案。例如,如果开发团队更精通Struts,那么可以使用它而不是Spring MVC,而其他应用程序则使用Spring组件和诸如JDBC和事务之类的特性。在这里描述的两个场景中,开发人员无需部署整个Spring框架。它们只需要相关的模块(如Spring DAO)以及Spring IOC container和Struts库。
图2-1显示了Spring框架的各个模块。
图2-1
核心容器
核心模块构成整个Spring框架的主干。所有其他Spring模块都依赖于此模块。它也被称为IOC容器,是Spring支持依赖注入(DI)的核心。
控制反转
国际奥委会的最佳描述是“好莱坞原则”,即“不要给我们打电话”;我们会打电话给你。(小艺术家们经常从好莱坞的制片经理那里听到这个消息。)然而,这在软件开发中也很重要,可以控制应用程序的流,同时确保高内聚和低耦合。为了更好地理解,这让我们考虑一个简单的例子,当您的应用程序执行一些计算并使用log4j之类的日志库打印最终结果时。在这种情况下,应用程序代码负责在log4j API上调用方法时的控制流,并在必要时调用方法。
另一方面,IOC对任何框架都是至关重要的。在IOC中,应用程序对象通常在框架中注册,该框架在适当的时间或事件中负责调用注册对象上的方法。这种控制是颠倒的,因为与调用框架API的应用程序代码不同,事情正好相反。因此,简而言之,IOC是允许另一个对象或框架调用应用程序对象上发生的适当事件的方法的原则。
依赖注入开发人员通常认为,IOC和DI是一回事。这是incor rect,我想在一开始就说明它们是两个不同的兽医相关概念。正如IOC处理应用程序中的控制流,DI描述了一个对象如何解析或找到需要调用某些meth ods的其他对象。有几种方法可以实现DI,其中一个策略是IOC。我将在接下来的几节中逐一讲解不同的DI策略。直接实例化直接实例化是DI的最简单形式。依赖对象直接使用new操作符来使用,如清单2-1所示。
清单2-1:
Public class FormulaOneDriver{
Public Car getCar(){
Car car.new FerrariCar();
Return car;
}
}
一级方程式赛车(方程式赛车)需要一辆车来驾驶。因此,它直接创建Car对象的一个实例并使用它。直接实例化增加了耦合,并分散了整个应用程序的对象创建代码,使得维护和单元测试变得困难。
工厂辅助
工厂帮助器是一种常见的、广泛使用的依赖注入策略。它是基于GOF工厂方法设计模式。工厂方法将新操作符的使用合并起来,并根据一些输入提供适当的对象实例。如清单2-2所示。
清单2-2:
Public class FormulaOneDriver{
Public Car getCar(){
Car car.CarFactory.getInstance(“FERARI”);
return car;
}
}
使用工厂可以促进对象设计最佳实践,称为程序接口(P21)。这一原则声明,具体对象必须实现在调用程序中使用的接口,而不是具体对象本身。因此,您可以轻松地替换不同的实现,对客户机代码的影响很小。换句话说,没有直接依赖于导致低耦合的具体实现。清单2-3显示了Car接口。
清单2 - 3:Car.java
Public interface Car{
Public Color getColor();
//other methods
}
法拉利提供了汽车界面的具体实现,如图所示。
清单2 - 4:FerrariCar.java
Public class FerrariCar implements Car{
//...implementation of methods defined in Car
//...implementation of other methods
}
此模式还将对象创建合并到少数几个工厂类中,使其易于维护。有了工厂帮助器,也可以使对象cn配置成为可配置的。您可以定义您在某些属性或XML配置文件中提供的具体实现,使其能够在动态中切换。
定位在服务注册中心
第三种方法应该熟悉EJB开发人员。它们通常需要在JNDI注册表服务中查找EJB对象引用。在这种情况下,EJB对象已经用特定的键在JNDI中注册并注册了。对象可能位于远程JVM中,但是JNDI使用此键进行查找,类似于清单2-2。所有这些策略通常称为pull依赖注入。这是因为依赖对象被最终使用它的对象拉进来。我倾向于将pull方法归类为依赖项解析,而不是依赖注入。这是因为真正的依赖注入发生在IOC,称为push DI。在这种方法中,外部容器或应用程序框架创建并将依赖对象传递给需要它的对象。依赖对象大多是sup。使用构造函数或setter方法。但是,对于这一点,应用程序框架必须知道要提供哪些依赖对象,以及要向依赖对象通知哪些对象。有趣的是,EJB容器不仅支持pull DI(一个会话bean查找另一个会话bean,例如在JNDI中),还支持DI。这在setSessionContext (javax.ejb)中很明显。SessionContext ctx)或setEntityContext (javax.ejb)。EntityContext ctx)方法,上下文对象被创建、初始化并通过容器传递给EJB对象。这叫做setter注入。当我接触Spring IOC容器的DI特性时,您可以在后面的部分中使用示例来探索不同的push DI变体。
DI的好处
以下是DI的好处:
.依赖注入促进松散耦合。例如,对于工厂帮助器,您可以通过P21删除硬编码的依赖项。可以在应用程序外部配置它们,并提供热切换和热插拔实现。
.它促进了测试驱动开发(TDD)
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[24532],资料为PDF文档或Word文档,PDF文档可免费转换为Word
以上是毕业论文外文翻译,课题毕业论文、任务书、文献综述、开题报告、程序设计、图纸设计等资料可联系客服协助查找。