选择技术栈构建通用平台

Java社区中有很多关于Spring vs Java EE的话题。 一群人会争辩说您应该使用一个而不是其他。等等。当我看到这一点时,我不禁要想为什么我们不能同时使用它们呢? 实际上,我认为有效地使用它们会为构建基础架构创建一个伟大的技术堆栈,例如对于一家大型公司而言,该公司希望提供一个可以托管和运行许多不同应用程序和项目的通用平台。

为什么将Spring和Java EE结合在一起?

在编写软件时,我们创建和构建可重复使用的库/框架,并帮助我们更快地完成工作。 Spring是一个像瑞士军刀一样的库,它允许以一种非侵入性的方式构建应用程序,并具有许多更简单的包装器和帮助器类。 这就是我所说的“对开发人员友好”的库。

但是,许多人没有意识到Spring只是一个包含对许多可以简化开发工作的包装器的库。 例如,Spring具有一个Web框架层,可让您编写MVC Web应用程序,但是您仍然需要Servlet容器(服务器)。 Spring提供的数据层主要包装了其他JPA / Hibernate / JDBC,这些JPA / Hibernate / JDBC很好地集成在了它们的IoC容器中,但是实际的ORM实现不在Spring之外(例如:Hibernate)。 Spring包装了JMS甚至JNDI进行开发,但是您仍然需要JMS服务器或JNDI提供程序。 Spring具有事务管理器抽象层,但它只是一个包装器(对于单个数据库,实际上是数据库供应商提供了交易保证的ACID属性,而不是Spring)。 如果要在多个资源(例如JMS和数据库,或多个数据库)上进行原子事务,则仍然需要“真实”事务管理器(JTA)!

所以现在您看到,要构建成功的企业应用程序,您需要在许多供应商提供的功能之上使用Spring。 如果您不小心,可能会陷入难以集成和部署的许多专有服务中。 这就是Java EE的用武之地。这是规范布局,供应商必须以标准方式提供大多数这些服务。 因此,任何JEE法规遵从性服务器都将提供带有标准API的服务,该标准API应该以类似的方式工作。

现在必须保持平衡。 根据我的经验,您执行的标准越多,获得的“对开发人员友好的”就越少。 但是,与此同时,如果没有标准,则很难提供通用的基础结构,例如API,运行时服务器甚至OS环境进行部署。 这就是为什么我认为将Spring与Java EE相结合将为IT社区带来一个更实用和有效的平台的原因。

选择技术栈

并非每个项目的创建都是平等的,他们的需求在很大程度上不同。 因此,不可能提供一个满足所有项目需求的通用技术堆栈。 但是我们当然可以尝试创建一个可以满足大多数项目需求的通用工具。 另外,选择一个具体的库/堆栈是非常有根据的,无论选择哪种实际实现,总是会有利弊的。 考虑到这一点,我将尝试提出自己对技术栈的个人选择,我认为它将为承载各种项目和应用程序提供最灵活的平台。 特别是在大型公司环境中。

我将选择Java EE应用程序服务器作为通用平台。 从中,我将选择一些“对开发人员友好”的库来替换(或在顶部添加)一些现有的EE标准,以提高生产率。 我认为EE已经走了很长一段路,并且在每次规范迭代中都变得更好,但是我仍然觉得将POJO服务连接在一起时,使用Spring作为IoC容器比使用CDI有更大的灵活性。 另外,Spring框架带有非常灵活的MVC层,与普通的Servlet API相比,该层有效且易于开发。

使用Java EE 6,服务器必须提供两个配置文件。 因此,让我们从这两个视图开始探索堆栈。

JEE Web配置文件–基于Web的更轻便的应用程序

  • 使用Spring MVC(控制器,表单,验证,ModelAndView和IoC配置)代替普通的Servlet API编程。
  • 使用尽可能多的POJO编写后端业务服务逻辑,并使用Spring IoC进行连接。 不要滥用这个。 我个人认为,与CDI相比,Spring IoC更灵活,更易于使用。
  • 将JPA用于数据服务层而不是JDBC API编程。
  • 使用JSON数据交换格式。 根据经验,与XML相比,JSON更加高效且易于使用。
  • 视图选项:
    • 使用格式正确的xhtml / Bootstraps / jquery / AJAX->如果您只需要静态页面和一些客户端交互
  • Servlet 3.0现在支持异步请求。 这解决了Web域中的许多难题。 如果需要,可以利用它! (最新的Spring MVC已经对此提供支持。)

JEE 6完整个人资料–完整EE功能应用程序

  • 在Web配置文件中上述所有内容之上。
  • 将JMS用于属于点对点或发布/订阅域的任何消息传递需求。
  • 当您需要原子事务进行多个数据库和/或JMS交付时,请使用JTA。
  • 使用标准的JAX-RS(RESTful Web服务API)公开外部服务。 使用JSON数据交换格式。
  • 使用一致的Spring IoC进行服务注入。 与CDI相比,它更灵活,更易于使用。
  • 如果可能的话,使用POJO服务并通过Spring代替EJB进行连接。 我发现它们更易于测试和开发。
  • 加上它所支持的其他任何EE规范,例如(JavaMail和JCA等。通常,Spring也会为这些API提供更简单的包装。)

Apache Camel –轻量级ESB

Camel项目不是EE标准。 但是,我的经验是,使用简单的骆驼路线/工作流程可以轻松完成许多常见的IT工作。 Camel的开发和样式易于理解且易于测试。 它可以作为独立的应用程序/服务运行,也可以作为Web应用程序的一部分运行。 我相信,在上面的通用平台之上添加一个巨大的价值。 您将在需要以下各项时使用它:

  • 对于任何类似工作流流程的集成模式(例如:将文件轮询器桥接到Web服务,将JMS队列桥接到数据库等)
  • 用于创建业务工作流程。
  • 适用于任何ETL工作流程。
  • 为了轻松将业务需求工作流映射到代码逻辑流程

使用哪个EE应用程序服务器

我认为这也是主观的,但是我们需要选择适合我们业务需求的产品。 我个人更喜欢JBoss,因为它是开源的,但是他们提供了其应用服务器的商业支持版本。 作为基于开源的产品,它使开发人员在学习和探索平台方面具有更大的灵活性。 我也看到了他们内部项目的许多好处,例如开放的测试工具和库,这些都使平台开发人员受益。

Tomcat服务器呢?

Tomcat是一个非常著名的Servlet容器。 但是,它只是一个支持Servlet / JSP应用程序的Web容器。 它不提供Java EE服务器提供的JMS或JTA功能。 事实上,仅使用一个简单的Tomcat服务器就可以满足许多Web应用程序的需求。 但是,在大型IT环境中,您经常需要仅由Java EE服务器提供的其他服务。 在许多情况下,人们将只需要运行Tomcat webapp并在需要时桥接到其他Java EE服务器。

使用JEE6,可以将Web配置文件简化为大多数Web容器功能,这应该使服务器启动更快(加载更少的额外服务)。 但是,如果应用程序需要额外的EE功能,我们提供的平台将能够支持它们。

参考:在A Programmer's Journal博客上 ,选择我们JCG合作伙伴 Zemian Deng的技术堆栈来构建通用平台 。

翻译自: https://www.javacodegeeks.com/2013/06/choosing-technology-stack-to-build-a-common-platform.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

模式的秘密--工厂模式

工厂模式概念: 实例化对象,用工厂方法代替new操作工厂模式包括工厂方法模式和抽象工厂模式抽象工厂模式是工厂方法模式的扩展工厂模式的意图: 定义一个接口创建对象,但是让子类决定哪些类需要被实例化。工厂方法把实例化的工作推迟…

mysql定时清空表数据_Mysql实现定时清空一张表的旧数据并保留几条数据

要达到如下目的:Mysql数据库会每隔一段时间(可以是2小时,也可以是一天,这个可以自定义),定时对一张库中的表做一个判断,如果这张表的数据超过了20条(这个数据也是自定义的,也可以是200条),就保留…

Python中生成器generator和迭代器Iterator的使用方法

一、生成器 1. 生成器的定义 把所需要值得计算方法储存起来,不会先直接生成数值,而是等到什么时候使用什么时候生成,每次生成一个,减少计算机占用内存空间2. 生成器的创建方式 第一种只要把一个列表生成式的 [ ] 改成 ( )ret (n 1 for n in range(0,10)) # 返回值是生成了一个…

Java 8中使用Lambda表达式的策略模式

策略模式是“ 设计模式:可重用对象的元素”书中的模式之一 。 本书所述的策略模式的意图是: 定义一系列算法,封装每个算法,并使它们可互换。 策略使算法独立于使用该算法的客户端而变化。 在本文中,我想给出一个或两个…

Html5移动开发之Localstorage(本地存储)

HTML5本地存储Localstorage自从Html5中出现了本地存储的(LocalStorage)的概念后,很多人都会想这个东西和我们传统web开发中的Cookie有什么特别之处,当然笔者也是其中之一,也难怪,以前用惯了cookie对于新出现的事物总是…

php mysql 正则_MySQL 正则表达式

MySQL 正则表达式在前面的章节我们已经了解到MySQL可以通过 LIKE ...% 来进行模糊匹配。MySQL 同样也支持其他正则表达式的匹配, MySQL中使用 REGEXP 操作符来进行正则表达式匹配。如果您了解PHP或Perl,那么操作起来就非常简单,因为MySQL的正…

Linux自动人机交互expect

exp_test.sh文件 #!/bin/bash/expect ## exp_test.sh set timeout -1; spawn ssh localhost; expect {"(yes/no)" {send "yes\r";exp_continue;}"password:" {send "hadoop\r";exp_continue;}eof {exit 0;} } 执行:expect …

使用Spring Integration聚合异步结果

嗨,我遇到了一个问题,该问题使用Spring Integration具有非常好的解决方案。 很多时候,我们需要一种将消息分发到未知数量的目的地的方案。 为此,我们使用主题方法。 但是有时,我们还希望从收到消息的所有目的地接收答案…

Html5开发之链接标签nav的用法

HTML(<nav>)元素用来表示一个含有多个超链接的区域&#xff0c;这个区域的连接可以连接到其他页面&#xff0c;也可以连接到本页面内部其他部分。用法说明:并不是所有的链接都必须使用<nav>元素,它只用来将一些热门的链接放入导航栏,例如<footer>元素就常用来…

java response 获得code_Java教程分享使用HttpClient抓取页面内容

Java教程分享使用HttpClient抓取页面内容&#xff0c;使用HttpClient工具来发送Http请求1.简介HttpClient 是 Apache Jakarta Common 下的子项目&#xff0c;用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包&#xff0c;并且它支持 HTTP 协议最新的版本和…

关于Function原型对象和Object原型对象的一些疑惑

网上有一道美团外卖的面试题是这样的&#xff1a;Function.prototype.a a; Object.prototype.b b; function Person(){}; var p new Person(); console.log(p.a: p.a); // p.a: undefined console.log(p.b: p.b); // p.b: b问为什么&#xff1f;有不少同学第一眼看上去就觉…

HTML5 实现离线数据缓存

1.配置缓存文件 cache manifestMIME TYPE&#xff1a;text/cache-manifest文件名称&#xff1a;name.appcache作用&#xff1a;用于配置需要缓存的文件2.使用方法在服务器上添加MIME TYPE在apache virtual host 中添加[plain] view plaincopyAddType text/cache-manifest .appc…

pytest.7.常见套路

From: http://www.testclass.net/pytest/common_useage/ 在使用pytest的时候&#xff0c;下面这些问题我们可能会经常遇到&#xff0c;这里给出官方的解决方案&#xff0c;按照套路来执行就可以了。 基础用法 把命令行参数传入到用例动态添加命令行参数根据命令行参数来忽略用例…

linux mysql 5.6.23_MySQL 5.6.23升级到MySQL 5.7.9

MySQL 5.6.23升级到MySQL 5.7.9MySQL 5.7.9新特性一、安全性1.1. 用户表 mysql.user 的 plugin字段不允许为空&#xff0c; 默认值是 mysql_native_password&#xff0c;而不是 mysql_old_password&#xff0c;不再支持旧密码格式;1.2. 增加密码过期机制&#xff0c;过期后需要…

Spring Data JPA教程第一部分:配置

Spring Data JPA是一个旨在简化基于JPA的存储库的创建并减少与数据库通信所需的代码量的项目。 在我的工作和个人爱好项目中&#xff0c;我已经使用了一段时间&#xff0c;确实使事情变得更加简单和整洁。 现在是时候与您分享我的知识了。 这是我的Spring Data JPA教程的第一部…

2018-03-02

1、首先我得重新在git设置一下身份的名字和邮箱&#xff08;因为当初都忘了设置啥了&#xff0c;因为遇到坑了&#xff09;进入到需要提交的文件夹底下&#xff08;因为直接打开git Bash&#xff0c;在没有路径的情况下&#xff0c;根本没&#xff01;法&#xff01;改&#xf…

《算法通关村——再次透彻理解动态规划》

《算法通关村——透彻理解动态规划》 91. 解码方法 一条包含字母 A-Z 的消息通过以下映射进行了 编码 &#xff1a; A -> "1" B -> "2" ... Z -> "26"要 解码 已编码的消息&#xff0c;所有数字必须基于上述映射的方法&#xff0c;反…

html5新特性:异步上传文件

<!DOCTYPE html><html><head><meta charset"utf-8"/><title>html5文件上传</title></head><body><input type"file" name"file" id"file" /><br/><input type"s…

查看环境变量有无配置成功等命令操作

查看环境变量有无配置成功 &#xff1a;windowR cmd set&#xff08;回车&#xff09; 现在可以看到配置成功的环境变量NVM_HOME NVM_SYMLINK等环境变量 也可以单独查看某个变量有无配置成功,例如set NVM—HOME. 转载于:https://www.cnblogs.com/JavascriptAndHtml5/p/9469932…

WildFly 8.0.0.Alpha1的发布和一些历史

自从我们发布WildFly 8.0.0.Alpha1版本以来&#xff0c; 已经过去了大约2周。 该下载位于WildFly下载页面上 。 我敢肯定&#xff0c;你们中的许多人可能会想知道WildFly是什么&#xff0c;而其中一些知道它是什么的人可能不会知道已经发布了。 我将尝试回答其中一些问题&#…