为什么我会在2012年的新企业Java项目中使用Java EE而不是Spring

这个问题经常出现。 我的新项目也在2011年11月发布。 在这个新的Enterprise Java项目中,我将使用Java EE(JEE)代替Spring框架。

我知道:关于此主题的文章,博客和论坛讨论都可以找到。 为什么还需要一个? 因为许多博客都在谈论Java EE的旧版本,或者它们不是中立的(我希望是中立的)。 而且由于许多人仍然认为感谢EJB很繁重! 而且因为时间已经改变:现在是Java EE 6时代,J2EE已死。 最后! 最后,因为不仅可以使用JEE 6,而且还可以使用多个应用程序服务器(不只是Glassfish作为参考实现)。 我不想发动一场火焰战争(已经存在太多),我只想描述一下我对JEE与Spring“战斗”的个人看法……

因此,我认为从简短的概述和两种选择的历史入手非常重要。 然后,我将列出两者的差异,并解释为什么对于大多数新的Java项目而言,这些差异导致我使用JEE而不是Spring。 我明确地在谈论新的应用程序。 如果必须扩展现有应用程序,请继续使用现有框架!

另一个免责声明:我正在谈论关键任务企业Java应用程序。 我不是在谈论一些内部应用程序或其他不重要的内容。 我还更喜欢将Scala,Groovy和Clojure的组合持久化到NoSQL数据库,同时将其部署在JBoss OpenShift或VMware CloudFoundry等PaaS云服务中……

有关JEE和Spring的一般信息

首先,我想总结一些有关JEE和Spring的一般信息:

  • 最后,这两种选择都由几个库组成,开发人员可以使用它们来创建企业应用程序。
  • 两者都可以在大多数用例中使用,它们具有非常相似的功能(业务逻辑,事务,Web框架等等)–它们仅在实现上有所不同(例如,Spring中的声明性事务与JEE中的约定)。
  • 您也只能使用一个或某些可用库。 您甚至可以将JEE和Spring东西结合起来。
  • 通常,关键问题是:“我应该使用JEE(即,尤其是EJB,JPA,CDI等)或Spring核心框架(即,尤其是Spring Application Context,Spring Bean等)来实现我的新应用程序吗? 通常,您可以选择两者,从最终用户的角度来看都没关系。 但是您不应该将两者合并,这只会带来更高的复杂性。
  • 关于选择哪种替代方案一直存在争议。 中立地讨论这个问题非常困难。 这就是为什么几乎所有讨论都以赞美一个框架然后抨击另一个框架而结束的原因(我希望在本博文中保持中立)。

历史:J2EE太可怕了,因此Spring帮助了!

J2EE太可怕了。 如此多的XML配置,如此之多的接口以及如此la脚的应用服务器。 这就是创建Spring框架的原因。 它解决了J2EE的许多问题。 它轻巧,易于使用,并且可以将应用程序部署在Web容器(例如Tomcat)中,而不是部署在笨重的J2EE应用程序服务器中。 部署花费了几秒钟而不是15分钟。 不幸的是,JRebel当时不存在。 Spring框架不是J2EE的标准,但是它变得非常普遍,并且产生了一个庞大的社区。

JEE“偷”了轻量级的Spring创意!

一切始于一些捷径的改变。 J2EE已死。 新的快捷方式是JEE。 JEE 5诞生于2006年。它“窃取”了许多好的,轻量级的想法,例如来自Spring和其他框架的“基于配置的约定”或“依赖注入”。 是的,JEE应用服务器仍然很笨重,几乎不可能进行测试。 尽管如此,开发JEE应用程序对JEE 5还是很有趣的。创建EJB时不必编写20个接口。 哇,太神奇了!

然后,2009年发布了JEE 6。 开发是如此简单。 最后! 例如,您只需要添加一个注释,您的EJB就可以使用了! 当然,Spring框架的开发人员没有睡觉。 添加了许多新内容。 今天,您可以创建一个没有任何XML文件的Spring应用程序,就像几周前我在“ No Fluff Just Stuff”文章中所读到的一样。 此外,在Spring堆栈中添加了一些非常酷的框架,例如Spring Integration,Spring Batch或Spring Roo。
如今(2011年11月),JEE和Spring都非常普及,并拥有庞大的社区。 两者都有很多信息,例如书籍,博客,教程等。 因此,在描述了JEE和Spring的发展之后,为什么在大多数新的Java项目中使用JEE?

JEE和Spring的优缺点

必须做出决定。 在新项目中使用哪种替代方法? 让我们看看两者的利弊。 我将在Spring的优势上添加一个“ BUT”-这些“ BUT”是我更喜欢JEE而不是Spring的原因。

JEE的优势

  • JEE是一组标准规范,因此与供应商无关。 通常,规范存在几种实现。
  • 可持续性:嗯,这是几个大型公司支持的标准的优势。
  • 是的,信不信由你,测试是可能的! 轻量级的应用程序服务器和框架(例如Arquillian)进入了JEE世界!
  • 约定超越配置无处不在,而不是明确的(我知道有些人会不同意这是一个优势)。

弹簧的优点

  • 您不需要笨重的JEE应用程序服务器,可以将应用程序部署在Web容器(例如Tomcat)中。

但是:JEE应用程序服务器并不像几年前那样繁重。 此外,也可以使用JEE Web配置文件。 您不必使用Tomcat或Jetty来减轻重量!

  • Spring提供了JEE标准无法提供的功能,例如Spring Batch。

但是:您可以毫无问题地将这样的库添加到JEE项目中。 如果需要,还可以添加其他Spring库,例如JDBCTemplate或JMSTemplate(它们有助于减少一些样板代码)。

  • Spring提供了更多的灵活性和功能,例如,面向方面的编程比JEE拦截器更强大。

但是:在大多数项目中,您不需要这种灵活性或功能。 如果确实需要,请使用Spring,而不是JEE-当然!

  • 更快的发布(因为它不是标准,只有一个供应商)。 对市场需求的反应要快得多。 当前的一些示例:云,移动,社交计算。

但是:我看到的所有企业项目(包括许多不同的客户)都不那么灵活。 企业应用程序不会每月或每年更改。 如果有一个项目,可以很容易地更改版本,那么在某些情况下,Spring可能比JEE更好。 但是在大多数企业项目中,您不能简单地从Spring 2.5升级到Spring 3.x或从JEE 5升级到JEE6。我希望这是可能的,但是在拥有数千名员工的大公司中,灵活性和政治规则较低。

结论:我将在大多数新的Enterprise Java项目中使用JEE

由于我在“ BUT”部分中针对Spring进行解释的原因,我将在大多数新的Enterprise Java项目中选择JEE。 不过,有时我也会使用Spring库(例如Spring Batch)。 有时,我什至必须使用Spring(如果我需要它的灵活性或强大功能),但是只有这样,我才选择它。 当然,对于现有项目,我将继续使用已经使用的框架。 我可能不会将Spring 2.5应用程序迁移到JEE,而是将其迁移到Spring 3.x!

因此,我已经说明了为什么在大多数新的Enterprise Java项目中使用JEE的原因。 如果我错过了一些事情,或者您有其他意见(可能有很多人),则可以在评论中让我失望。 我感谢所有的“非战争”讨论……

参考: 为什么我将在 JCG合作伙伴的 2012年新的Enterprise Java项目中使用Java EE而不是Spring   关于Java EE / SOA /云计算的博客的Kai Wahner。


翻译自: https://www.javacodegeeks.com/2012/03/why-i-will-use-java-ee-instead-of.html

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

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

相关文章

jsp mysql 音乐网站_Maven+JSP+SSM+Mysql实现的音乐网站

项目简介本系统基于MavenJSPSSMMysql实现的音乐网站。主要实现的功能有音乐播放、下载、上传等几个模块。难度等级:中等技术栈编辑器Eclipse Version: 2020-03 (4.15.0)前端技术基础:htmlcssJavaScript框架:JQueryBootstrap后端技术SpringSpr…

遥感影像滤波处理软件 — timesat3.2

最近因为要做遥感影像的滤波处理,经过女神推荐,决定用Timesat,可是该软件3.1版本只适合xp系统以及2011的matlab,后来在官网上找到了最新的3.2版本。支持64位操作系统以及2014的matlab。大家可以直接上官网(http://www.…

持久化API(JPA)系列(三)实体Bean的开发技术-建立与数据库的连接

在EJB 2.x中。EJB有3种类型的Bean。各自是会话Bean(Session Bean)、消息驱动Bean(Message-Driven Bean)和实体Bean(Entity Bean)。 随着EJB 3的推出,EJB2.x中的实体Bean逐渐被JPA规范所替代&…

WebSphere Classloader内存泄漏预防

解决应用程序类加载器泄漏 应用领域 倾向于: 使用应用程序类加载器中的Runnable实现启动新线程。 即使JEE编程模型不支持此功能,客户也经常直接创建新线程或通过使用间接创建它们 计时器 客户必须确保在停止相应的应用程序(或WAR模块&…

airflow sql_alchemy_conn mysql_airflow使用mysql数据库,LocalExecutor并发调度

mysql-airflow在mysql上执行create database airflow; —— 创建数据库GRANT all privileges on airflow.* TO airflow% IDENTIFIED BY 123456; —— 将数据库airflow的所有权限授权airflow用户,密码123456且该用户可在任何IP段登录操作FLUSH PRIVILEGES; —— 刷新…

【SAP业务模式】之ICS(四):组织单元的配置

SAP的ICS业务后台配置主要有以下几个配置点: 1、组织单元的配置(公司代码、销售组织、工厂、采购组织等); 2、主数据的部分; 3、订单和开票的定价过程; 4、开票输出类型; 5、公司间发票的配置&a…

poj-2478 Farey Sequence(dp,欧拉函数)

题目链接&#xff1a; Farey Sequence Time Limit: 1000MS Memory Limit: 65536KTotal Submissions: 14230 Accepted: 5624Description The Farey Sequence Fn for any integer n with n > 2 is the set of irreducible rational numbers a/b with 0 < a < b < n a…

Twitter4j和Esper:在Twitter上跟踪用户情绪

对于复杂事件处理和Twitter API的新手&#xff0c;我希望这是一个简短的教程&#xff0c;可以帮助他们Swift起步。 管理大数据并从中挖掘有用的信息是当前技术中最热门的讨论主题。 来自Twitter&#xff0c;Facebook和Linkedin等社交网络的半结构化数据的爆炸式增长使Hadoop&am…

webase crud查看所有表_Laravel-Gii 可视化代码生成工具 CRUD +GUI

Laravel-Gii 可视化代码生成工具 CRUD GUI适用于快速B端后台开发&#xff0c;根据MySQL的表结构生成对应的Model、Observer、Controller、View、Route等相关项目文件[TOC]注意因为是解析MySQL的表结构&#xff0c;并且根据字段生成模板&#xff0c;所以目前生成的Model类时只支…

20145231第二周Java学习笔记

20145231 《Java程序设计》第2周学习总结 教材学习内容总结 本周的学习采用的依然是先看课本&#xff0c;再看视频&#xff0c;然后实践敲代码&#xff0c;最后根据学习笔记总结完成博客。 第三章&#xff1a;基础语法 知识点比较多比较零碎&#xff0c;整理的都是实际操作中可…

JavaFX 2.0和Scala,像牛奶和饼干

JavaFX 2.0和Scala都是很好的技术&#xff0c;但是一起使用时效果会更好。 JavaFX 2.0是一种功能强大的富客户端技术&#xff0c;具有先进的图形&#xff0c;动画和媒体功能。 Scala是一种简单但功能强大的语言&#xff0c;具有用于编写特定于域的语言&#xff08;DSL&#xff…

ASP.NET WebAPi之断点续传下载(上)

前言 之前一直感觉断点续传比较神秘&#xff0c;于是想去一探究竟&#xff0c;不知从何入手&#xff0c;以为就写写逻辑就行&#xff0c;结果搜索一番&#xff0c;还得了解相关http协议知识&#xff0c;又花了许久功夫去看http协议中有关断点续传知识&#xff0c;有时候发觉东西…

贪吃蛇(C++实现,VC6.0编译,使用了EasyX图形库)

程序效果&#xff1a; 代码&#xff1a; //main.cpp 1 #include <iostream>2 #include<fstream>3 #include <graphics.h>4 #include <conio.h>5 #include<ctime>6 #include<windows.h>7 #include<mmsystem.h>8 #pragma comment(lib…

3.0 C++远征:is a

4-4is_a 0.派生类Soldier继承自基类Person //Person.h class Person { public:Person(string name "Jim");~Person();void play(); protected:string m_strName; };//Soldier.h class Soldier : public Person { public:Soldier(string name "James", in…

python中sorted的用法append_python sorted()排序详解

排序&#xff0c;在编程中经常遇到的算法&#xff0c;我也在几篇文章中介绍了一些关于排序的算法。有的高级语言内置了一些排序函数。本文讲述Python在这方面的工作。供使用内置函数sorted()/list.sort()的使用简单应用python对list有一个内置函数&#xff1a;>>> a[5…

云上的播放框架变得简单:Openshift模块

仅仅几年前&#xff0c;找到一个负担得起的Java Web应用程序托管解决方案是一项艰巨的任务&#xff0c;而寻找免费的托管解决方案是一项不可能的任务。 更不用说甚至考虑自动缩放&#xff0c;单命令部署&#xff0c;持续集成等事情&#xff0c;这都是科幻小说。 去年见证了云计…

C#中的yield return与Unity中的Coroutine(协程)(下)

Unity中的Coroutine&#xff08;协程&#xff09; 估计熟悉Unity的人看过或者用过StartCoroutine() 假设我们在场景中有一个UGUI组件&#xff0c; Image&#xff1a; 将以下代码绑定到Image 1 using UnityEngine;2 using System.Collections;3 using System.Threading;4 using …

字节流转化为文件流_C#文件转换为字节流及字节流转换为文件

本文讲解了C#实现文件转换为字节流的方法。文件转换为字节流的步骤如下1、通过文件流打开指定文件(FileStream fs)&#xff1b;2、定义字节流(byte[] fileBytenew byte[fs.Length])&#xff1b;3、把文件读取到字节流(fs.Read(fileByte,0,fileByte.Length))&#xff1b;4、关闭…

Spring和JSF集成:导航

我希望这是有关我在Spring和JavaServer Faces之间提供深度集成的努力的一系列博客中的第一篇。 这里提到的所有内容都是“正在进行中的工作”&#xff0c;因此&#xff0c;如果您签出代码&#xff0c;请注意它是一个不断变化的目标。 期待一些粗糙的边缘&#xff0c;如果有时会…

【CSS3动画】transform对文字及图片的旋转、缩放、倾斜和移动

前言&#xff1a;之前我有写过CSS3的transform这一这特性&#xff0c;对于它的用法&#xff0c;还不是很透彻&#xff0c;今天补充补充&#xff0c;呵呵 你懂的&#xff0c;小司机准备开车了。 a)再提一提transform的四个属性 ①旋转--->rotate(参数a)&#xff0c;单位deg&a…