JavaSE、JavaEE 与Spring的概念
在Java世界中,很多人都对Java SE、J2EE、Java EE、Spring、EJB等这些术语感到困惑。
什么是Java SE
可以说这是Java的核心。(主要部分)
用于开发桌面应用程序和基于web的应用程序。
它提供了从基本对象到高级类的所有东西,这些类被用于网络、数据库访问、安全、XML解析、GUI开发。
除了这些核心api之外,它还提供了虚拟机(JVM)、开发工具、部署技术等
什么是Java EE
Java EE是一个抽象的规范。
具体实现称为应用服务器(如GlassFish、WildFly、WebLogic)。
当您从Oracle站点下载Java EE时,它将给您提供大量文档和示例的GlassFish服务器。因此,它们只是提供了Java Enterprise Edition规范的实现。
您还可以使用其他的实现,比如RedHat WildFly,它也遵循这些规范。
因此,J2EE是1999年到2003年Java EE的抽象规范的版本名称。
EJB遵循Java EE规范,所以EJB属于JavaEE。
什么是Spring
Spring遵循“所有”JavaEE规范吗? 严格地说不是
Spring是一个独立的框架,它替代并改进了JavaEE的许多部分。
您可以将Spring视为一个集成平台,允许您使用所有JavaEE技术。
这意味着您不一定需要完整的fledge JavaEE应用服务器来支持。
您可以在像Tomcat这样的简单servlet容器上运行它。
Spring是一个独立的集成平台(框架),在JavaEE中有改进和替换,也允许您使用JavaEE技术。
JavaEE 与Spring的区别
Rod Johnson带着他的革命书籍,《J2EE Development without EJB》,描述了新的Spring框架的特性。它就像一股新鲜空气,很快,Spring的直觉依赖注入功能成为了控制反转(IoC)设计模式的实际标准实现。
从那时起,JEE和Spring都在发展,尽管Spring似乎总是在前进。Spring引入的所有最佳功能后来都被“标准”企业Java采纳,包括:
Spring IoC在JEE中实现为容器依赖注入(CDI);
JEE作为JSR 352实现的Spring批处理:Java平台的批处理应用程序。
公平地说,在Java中很酷的新功能,比如注解,也会导致对Spring的修改。除了在第三次迭代中提供基于注解的配置之外,Spring也变得模块化,至少在一定程度上归功于Maven的巨大流行,它引入了一种解决和管理依赖第三方库的新方法。事实上,JEE和Spring继续相互影响并相互鼓励,比如当JEE 7引入了Web profile的模块化,开发了JAX的开发人员,并促进了更轻量级的企业应用程序。类似地,从Java 8的JCP 335和JCP 310的日期和时间API,在Spring中激发了新的增强。可无论是JEE还是Spring的支持者都倾向于认为它们是相互排斥的。
让我们来看看在一个更平衡的环境中进行比较
Java EE:
Java EE行业认可的标准API框架
它主要基于注释和CDI
用于web开发的JFC MVC框架
用于进程数据库操作的JPA实现
JTA API和实现
基于EJB容器和POJO的实现
Oracle许可证
Spring:
基于IOC和AOP
基于XML配置(现在他们正在利用注释)
使用Spring DAO框架(基于模板设计patter)连接到数据库
提供抽象层以支持各种JTA实现供应商
与不同的Java厂商的不同支持不同的功能,这样容易与struts等集成
提供端到端平台构建web应用程序,实现使用DI和AOP的松散耦合
开放源码许可
Spring的实现重点与JEE的标准化和可移植性
SpringSource社区与Java社区过程的主要区别在于其不同的动机。SpringSource的创新来自于解决现实世界问题的需要。解决方案以解决问题为导向,这样下一个步骤和整个项目就可以尽可能快速和顺利地实现。
JCP有点像公司。创新和决策与解决方案如何导致标准技术规范相关联。另外,像Oracle、IBM、RedHat甚至SpringSource参与JCP。大多数Java规范请求都需要很长的路径才能实际实现。例如,jsr - 303:Bean验证需要三年才能完成。也许在这个领域,速度并没有那么重要,因为大多数大型企业项目不会经常发生变化,而且会有更长的生命周期。他们甚至可能不想要所有最新的、但未经证实的技术。
JEE的另一个论点是可移植性。简而言之,JEE是一组规范。你在你的应用程序中使用的东西可以被拉入你选择的任何JEE兼容的容器中。简单地说,用一些常规的方法来包装业务逻辑,为CRUD操作提供持久性,然后从14个JEE供应商中选择。理想情况下,您应该能够在不同服务器之间移动代码。这有时行得通。首先,现在只有三个供应商支持JEE 7,所以很多都变得无关紧要了。其次,有些实现是特定于供应商的,并且仍然需要时间和资源来让项目在不同的环境中运行。当然,这取决于项目的复杂性。一个简单的示例应用程序将从任何一个开始,但不是一个复杂的。
另一方面,Spring只支持VMWare,它被认为是其他库的包装器,将它们耦合在一起,提供更容易的访问和配置功能——如果您知道如何做到这一点的话。但是Spring应用程序可以在一个成熟的JEE服务器上运行,也可以在轻量级JSP容器中运行,比如Jetty、Tomcat或Netty,避免了巨大的开销。Spring甚至可以在独立模式下运行,因为Spring引导模块可以包装Jetty或Tomcat。
性能对JEE与Spring的大多数比较测试都存在缺陷。只有良好的负载和压力测试,以及持续的基准测试才能真正分析应用程序中的瓶颈。事实是,一个或另一个容器可能更适合于任何特定的情况。
学习曲线
当然,无论是Spring还是JEE,学习曲线都是陡峭的。让我们从地面开始。复杂性是感知、经验、知识、情绪、勇气的问题。这一切都不容易,但同样的想法仍然存在于双方——相反的技术是一个复杂的结,它会在你试图解决某一特定任务的时候偷走你的时间。(并不是真的有这样的强硬的Spring或有思想的人:)我发现Spring是逻辑结构,而类名TransactionAwareConnectionFactoryProxyUserCredentialsConnectionFactoryAdapter看起来吓人,他们描述的实现类没有挖掘教程。另一方面,JEE依赖于零散的规范。但是,通过了解应用程序的哪一部分需要理解,您可以在适当的指南中找到它。这两个框架都有大量的例子和指南。最后,Spring和JEE建立在相同的原则之上,以提供Java web应用程序开发的工具。如果您了解基本的软件模式和设计,您将能够了解其中任何一个。