揭秘Java帝国的全能家族——Spring的成王之路

2020-05-09 17:07发布

很久很久以前,古老的 Java 编程帝国里降生了一个孩子,名为 Spring,它是 Java 帝国最小的王子,同时也是 Java 帝国期待已久的孩子。

它还有三个哥哥,分别是大哥 JSF、二哥 Struts 和三哥 Hibernate,它们一起为 Java 帝国的编程事业添砖加瓦。

相比三个哥哥的术有术攻,促使 Spring 降生有两个重要原因:

1、使 Java EE 开发更加容易;
2、解决企业应用开发的复杂性而创建,但又不仅限于服务器端的开发,而是所有让 Java 应用都可以从 Spring 中受益。

粉雕玉琢的 Spring 小王子备受 Java 帝国人民的喜爱,以往需要几个大王子一并合作的项目,Spring 小王子一个人便可完成,它让开发变得更加简单高效。

他是一个基于 POJO(简单 Java 对象)的轻量级框架,最大的特点是其依赖注入方式,在 Spring 中创建 bean 和对象的职责交给了 Spring 框架来统一管理、完成和维护。

Spring 小王子的成长轨迹

2004年,Spring 1.0,彻底改变了开发企业级 Java 应用程序的方式。
2006年,Spring 2.0,在配置里使用自定义的 XML 命名空间,更小、更简单易懂的配置文件让 Spring 本身更便于使用。
2007年,Spring 2.5,面向注解的依赖注入模型(即@Component和@Autowired注解),以及面向注解的 Spring MVC 编程模型,不用再去显式地声明应用程序组件了,也不再需要去继承某个基础的控制器类了。
2009年,Spring 3.0,一套基于Java的全新配置,它能够取代 XML,一系列以@Enable开头的注解进一步完善了这一特性,可以写出一个没有任何 XML 配置的 Spring 应用程序。
2013年,Spring 4.0,对条件化配置提供了支持,根据应用程序的 Classpath、环境和其他因素,运行时决策将决定使用哪些配置,忽略哪些配置。那些决策再也不需要在构建时通过编写脚本确定了(以前会把选好的配置放在部署的包里)。
2017年,Spring 5.0,主要功能是对反应式编程的支持,包括 Spring WebFlux。这是一个全新的反应式 Web 框架, 借鉴了 Spring MVC 的编程模型,允许开发人员创建伸缩性更好且耗用更少线程的 Web 应用程序。

从带着使命感诞生到每个阶段的成长,Spring 小王子为 Java 帝国奉献了一切,从来没有让程序员们失望过。

Spring 小王子核心秘密武器

自诞生以来,Spring 小王子便鼓励 Java 帝国的人民使用模块化的方式进行编程,他使用一个核心容器和很多个其他的模块来搭配,继而满足 Java 帝国建设各种各样的需求。

  • 核心容器

这是 Spring 框架最基础的部分,它提供了依赖注入(DependencyInjection)特征来实现容器对 Bean 的管理。这里最基本的概念是 BeanFactory ,它是任何 Spring 应用的核心。

BeanFactory 是工厂模式的一个实现,它使用 IoC 将应用配置和依赖说明从实际的应用代码中分离出来。

Spring核心容器包含了以下模块:

  • 应用上下文(Context)模块

核心模块的 BeanFactory 使 Spring 成为一个容器,而上下文模块使它成为一个框架。这个模块扩展了 BeanFactory 的概念,增加了对国际化(I18N)消息、事件传播以及验证的支持。

另外,这个模块提供了许多企业服务,例如电子邮件、JNDI 访问、EJB 集成、远程以及时序调度(scheduling)服务。也包括了对模版框架例如 Velocity 和 FreeMarker 集成的支持。

  • Spring的AOP模块

Spring 在它的 AOP 模块中提供了对面向切面编程的丰富支持。这个模块是在 Spring 应用中实现切面编程的基础。为了确保 Spring 与其它 AOP 框架的互用性,Spring 的 AOP 支持基于 AOP 联盟定义的 API。

AOP 联盟是一个开源项目,它的目标是通过定义一组共同的接口和组件来促进 AOP 的使用以及不同的 AOP 实现之间的互用性。通过访问他们的站点,你可以找到关于 AOP 联盟的更多内容。

Spring 的 AOP 模块也将元数据编程引入了 Spring。使用 Spring 的元数据支持,你可以为你的源代码增加注释,指示 Spring 在何处以及如何应用切面函数。

  • JDBC抽象和DAO模块

使用 JDBC 经常导致大量的重复代码,取得连接、创建语句、处理结果集,然后关闭连接。Spring 的 JDBC 和 DAO 模块抽取了这些重复代码,因此你可以保持你的数据库访问代码干净简洁,并且可以防止因关闭数据库资源失败而引起的问题。

这个模块还在几种数据库服务器给出的错误消息之上建立了一个有意义的异常层。使你不用再试图破译神秘的私有的 SQL 错误消息!

另外,这个模块还使用了 Spring 的 AOP 模块为 Spring 应用中的对象提供了事务管理服务。

  • 对象/关系映射集成模块

对那些更喜欢使用对象/关系映射工具而不是直接使用 JDBC 的人,Spring 提供了 ORM 模块。Spring 并不试图实现它自己的 ORM 解决方案,而是为几种流行的 ORM 框架提供了集成方案,包括 Hibernate、JDO 和 iBATIS SQL 映射。

Spring 的事务管理支持这些 ORM 框架中的每一个也包括 JDBC。

  • Spring的Web模块

Web上下文模块建立于应用上下文模块之上,提供了一个适合于 Web 应用的上下文。另外,这个模块还提供了一些面向服务支持。

例如:实现文件上传的 multipart 请求,它也提供了 Spring 和其它 Web 框架的集成,比如Struts、WebWork。

  • Spring的MVC框架

Spring 为构建 Web 应用提供了一个功能全面的 MVC 框架。虽然 Spring 可以很容易地与其它 MVC 框架集成,例如 Struts,但 Spring 的 MVC 框架使用 IoC 对控制逻辑和业务对象提供了完全的分离。

它也允许你声明性地将请求参数绑定到你的业务对象中,此外,Spring 的 MVC 框架还可以利用 Spring 的任何其它服务,例如国际化信息与验证。

如果作为一个整体,Spring 小王子的这些模块已经为 Java 帝国提供了开发企业应用所需的一切,但 Java 人民可以自由地挑选适合自己的应用的模块而忽略其余的模块,而不必将所有的模块完全应用。

基于上面的这些核心模块, Spring 小王子还提供了很多其他的有用的模块,用于构建健壮的基于 Java 帝国的应用程序:

数据库访问模块、事务管理模块、安全模块、Spring 集成模块、 批处理模块、消息模块、社交插件等。

Spring 小王子开枝散叶

经过多年发展, Spring 家族现在已枝繁叶茂,Spring 更是成为 Java 帝国生态系统中最主要的框架,其中Spring 5 的采用率约为 2/3。

家族的工作涵盖了 Java 帝国的J2EE开发、依赖维护、安全批处理、统一数据库访问、大数据、消息处理、移动开发以及微服务等众多领域。

在 Spring 小王子的孩子里面,最耀眼的莫过于 Spring Framework 、 Spring Boot 和 Spring Cloud 这三个小辈。

Spring Framework

◆ 强大的基于 JavaBeans 的采用控制反转(Inversion of Control,IoC)原则的配置管理,使得应用程序的组建更加快捷简易;

◆ 一个可用于从 applet 到 Java EE 等不同运行环境的核心 Bean 工厂;

◆ 数据库事务的一般化抽象层,允许插件式事务管理器,简化事务的划分使之与底层无关。

◆ 内建的针对 JTA 和 单个 JDBC 数据源的一般化策略,使 Spring 的事务支持不要求 Java EE 环境;

◆ JDBC 抽象层提供了有针对性的异常等级(不再从SQL异常中提取原始代码),简化了错误处理,大大减少了程序员的编码量;

◆ 以资源容器,DAO 实现和事务策略等形式与 Hibernate,JDO 和 iBATIS SQL Maps 集成;

◆ 灵活的基于核心 Spring 功能的 MVC 网页应用程序框架;

◆ 提供诸如事务管理等服务的面向方面编程框架。

Spring Framework 就像是 Spring 家族的树根,使 Spring 家族得以在Java开发领域屹立不倒的根本原因,它的目标就是帮助 Java 帝国的开发人员开发出好的系统;

Spring Boot

◆ 可以创建独立的 Spring 应用程序,并且基于其 Maven 或 Gradle 插件,可以创建可执行的 JARs和WARs;

◆ 内嵌 Tomcat 或 Jetty 等 Servlet 容器;

◆ 提供自动配置的“starter”项目对象模型(POMS)以简化 Maven 配置;

◆ 尽可能自动配置 Spring 容器;

◆ 提供准备好的特性,如指标、健康检查和外部化配置;

◆ 绝对没有代码生成,不需要 XML 配置。

Spring Boot 相当于 Spring 家族的树干,它的目标是简化新 Spring 应用的初始搭建以及开发过程,致力于在蓬勃发展的快速应用开发领域成为领导者;

Spring Cloud

◆ Spring Cloud Netflix:是对 Netflix 开发的一套分布式服务框架的封装;

◆ Spring Cloud Config:将配置信息中央化保存, 配置 Spring Cloud Bus 可以实现动态修改配置文件;

◆ Spring Cloud Bus:分布式消息队列,是对 Kafka,MQ 的封装;

◆ Spring Cloud Security:对 Spring Security 的封装,并能配合 Netflix 使用;

◆ Spring Cloud Zookeeper:对Zookeeper的封装,使之能配置其它 Spring Cloud 的子项目使用;

◆ Spring Cloud Eureka:Spring Cloud Netflix 微服务套件中的一部分,它基于 Netflix Eureka 做了二次封装。

在近几年中,Java 帝国多了一个流行的概念——微服务,帝国人民普遍认为它能解决传统的单体架构应用所带来的顽疾(如代码维护难、部署不灵活、稳定性不高、无法快速扩展等), 以至于涌现出了一大批帮助实现微服务的工具。

而在它们之中,Spring Cloud 无疑是最令人瞩目的,不仅是因为 Spring 家族在 Java 帝国开发中的重要地位,更是因为 Spring Cloud 提供了一整套微服务实施方案 ,其中包括服务发现、分布式配置、客户端负载均衡、服务容错保护、API 网关、安全、事件驱动、分布式服务跟踪等工具,全面地解决了 Java 帝国人民在微服务开发领域所遇到的难点问题。

Spring Cloud 就如同是 Spring 家族这棵参天大树在 Java 帝国的微服务开发领域所结出的硕果。

Spring 家族初心不变

Spring 家族之所以能够在技术不断更新换代的 IT 领域长盛不衰,并且引领技术发展的潮流,是因为它一直没有偏离最初的目标——根据技术的发展,不断优化和革新,让 Java 应用的开发更加便利和高效

从 XML 配置、注解配置,再到 Spring Boot 的自动化配置,Spring 在不断简化,开发人员需要做的额外工作越来越少。

Spring 的这种基因代代相传,在可以预见的未来,Spring 及其家族产品依然是值得花时间投资学习的技术。

Spring 小王子和它的孩子们,会一直陪伴在每个 Java 帝国人民的身边,共同进步、共同成长。