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