1.1 从Spring到Spring Boot
本节将介绍Spring Boot的产生背景。我们先来回顾一下Spring框架的前世今生。
1.1.1 从EJB到Spring
EJB(Enterprise Java Bean)最初的设计思想是为分布式应用服务的。分布式是针对大型应用构造的跨平台的协作计算,EJB最初的目的就是为这种计算服务的。使用EJB技术的系统整体架构如图1-1所示。
图1-1 使用EJB技术的系统架构图
EJB的基础是RMI(Remote Method Invocation,远程方法调用), RMI利用Java对象序列化的机制实现分布式计算,实现远程类对象的实例化以及调用。通过RMI, J2EE将EJB组件创建为远程对象。RMI将各种任务与功能的类放到不同的服务器上,然后通过各个服务器间建立的调用规则实现分布式的运算。通过RMI的通信(底层仍然是Socket),连接不同功能模块的服务器,以实现一个完整的功能。
EJB规范定义了EJB组件在何时如何与它们的容器进行交互作用,容器负责提供公用的服务,例如目录服务、事务管理、安全性、资源缓冲池以及容错性。但这里值得注意的是,EJB并不是实现J2EE的唯一途径。但是软件发展到目前为止,大多数应用不需要采用这么重的解决方案,因此用EJB显得太臃肿了。
提示
更多关于J2EE的内容,可以参考:https://github.com/javaee。
对于中小型的应用项目而言,基本不采用分布式的解决方案,那么为什么要采取一个为分布式设计的方案来解决非分布式的问题呢?Spring就是为了解决这个问题而诞生的。
Spring的目的是为了解决企业应用开发的复杂性,它的主要功能是使用基本的Java Bean代替EJB,并提供了更多的企业应用功能。Spring使得已存在的技术更加易用。简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。Spring也提供了很多基础功能(事务管理、持久化框架集成等)。Spring的设计原则是“非侵入性”的,我们在实际业务逻辑代码中几乎感觉不到Spring框架的存在。
Spring框架的核心功能简单概括为:解耦依赖(DI)、系统模块化(AOP)。Spring“不重复发明轮子”,而是去集成业内已有的优秀解决方案。
Spring容器以Bean的方式来组织和管理Java应用中的各个组件及其组件之间的关系。基于Java Beans的配置管理,特别是对依赖注入(DI)技术的使用,减少了各组件间对业务逻辑具体实现的相互依赖性。
Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现。BeanFactory使用控制反转模式将应用的配置和依赖性规范与实际的应用程序代码分开。BeanFactory使用依赖注入的方式给组件提供依赖。
Spring框架主要用于与其他技术(例如Struts, Hibernate, MyBatis等)进行整合,将应用程序中的Bean组件实现低耦合关联,提高了系统的可扩展性和维护性。
Spring集成的AOP框架提供了诸如数据库声明式事务等服务。通过使用Spring AOP,我们无须依赖EJB组件,就可以将声明式事务管理集成到应用程序中。AOP的目的是提高系统的模块化程度。
当然,作为一个完整的J2EE框架,Spring生态中也给出了完整的分布式系统架构的解决方案,那就是Spring Boot + Spring Cloud,这个解决方案中包含了服务发现(Service Discovery)、断路器(Circuit Breaker)、OAuth2(实现SSO、登录token的管理)、服务配置(Configuration Server)、消费者驱动契约(Consumer-Driven Contracts)、API Gateway等。
Spring的微服务系统架构如图1-2所示。
图1-2 Spring的微服务系统架构图
1.1.2 Spring框架发展简史
Spring框架首次在2003年6月的Apache2.0使用许可中发布。第一个具有里程碑意义的版本是2004年3月发布的1.0。
下面是Spring框架的发展简史:
❑2003年,Spring0.9发布。2003年11月,Ben Alex将Acegi Security的代码贡献给Rod和Juergen,2006年5月发布Acegi Security。
❑2006年6月发布Spring Webflow 1.0。2006年8月发布Spring LDAP。2006年10月发布Spring 2.0。
❑2007年5月发布Spring Batch。2007年11月发布Spring 2.5。Spring 2.5是Spring 2.1各个里程碑版本的终结。
❑2011年6月发布Spring Data JPA 1.0。2011年12月发布Spring 3.1
❑2014年4月发布Spring Boot 1.0。2014年12月发布Spring 4.1.3
❑2015年7月发布Spring 4.2
❑2016年6月发布Spring 4.3
❑2017年9月发布Spring 5.0。2017年11月发布Spring Boot v2. 0.0.M7
❑2018年3月1日发布Spring Boot v2.0.0.Release;2018年4月5日发布Spring Boot 2.0.1.Release版本,是目前最新版本。
1.1.3 Spring框架的核心模块
Spring框架如图1-3所示。组成Spring框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。下面我们分别介绍。
图1-3 Spring架构图
1.核心容器模块
核心容器提供Spring框架的基本功能,包括Core、Beans、Context、EL模块。
Core模块封装了框架依赖的最底层部分,包括资源访问、类型转换及一些常用工具类。Beans模块中的主要组件是BeanFactory,它是工厂模式的实现。Context模块是一个配置文件,向Spring框架提供上下文信息。EL模块提供强大的表达式语言支持。
2. AOP、Aspects模块
AOP模块提供了符合AOP Alliance规范的面向切面的编程实现,提供比如日志记录、权限控制、性能统计等通用功能和业务逻辑分离的技术,并且能动态地把这些功能添加到需要的代码中;这样各专其职,可降低业务逻辑和通用功能的耦合。Aspects模提供了对AspectJ的集成,AspectJ提供了比Spring ASP更强大的功能。
3.数据访问/集成模块
该模块包括JDBC、ORM、OXM、JMS和事务模块(Transactions)。
事务模块用于Spring管理事务,只要是Spring管理对象都能得到Spring管理事务的好处,无须在代码中进行事务控制了,而且支持编程和声明性的事务管理。
JDBC模块提供了一个JBDC的样例模板,使用这些模板能消除传统冗长的JDBC编码还有必须的事务控制,而且能享受到Spring管理事务的好处。
ORM模块提供与流行的“对象-关系映射”ORM框架的无缝集成,包括Hibernate、JPA、MyBatis等。
OXM模块提供了一个对Object/XML映射实现,将Java对象映射成XML数据,或者将XML数据映射成Java对象,Object/XML映射实现包括JAXB、Castor、XMLBeans和XStream。
JMS(Java Messaging Service)模块提供一套“消息生产者、消息消费者”模板以便更加简单地使用JMS, JMS用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。
4. Web/Remoting模块
Web/Remoting模块包含Web、Web-Servlet、Web-Struts、Web-Porlet模块。
Web模块提供了基础的Web功能。例如多文件上传、集成IoC容器、远程过程访问(RMI、Hessian、Burlap)以及Web Service支持,并提供一个RestTemplate类来提供方便的Restful services访问。
Web Servlet模块提供了一个Spring MVC Web框架实现。
Web Struts模块提供了与Struts无缝集成,Struts1.x和Struts2.x都支持。
5. Test模块
Test模块支持Junit和TestNG测试框架,而且还额外提供了一些基于Spring的测试功能,比如在测试Web框架时,模拟Http请求的功能。
当下Spring生态中,Spring Boot、Spring Cloud和Data Flow三驾马车带领使用Spring进行应用开发勇往直前,如图所示:
使用Spring Boot构建一切服务。Spring Boot旨在让你尽可能快地启动和运行,并极简化Spring配置。
使用Spring Cloud协调一切服务。Spring Cloud使得实现分布式的、微服务风格的架构更加简单。
使用Spring Cloud Data Flow连接一切服务。Data Flow将企业服务连接到任何移动设备、传感器、可穿戴设备、汽车等的互联网上。Spring Cloud数据流提供了一个统一的服务,用于创建地址流和基于ETL的数据处理模式、可组合的数据微服务。