Spring框架是一个开源的Java平台。它最初由Rod Johnson编写,并于2003年6月首次在Apache 2.0许可下发布。Spring是企业Java最流行的应用程序开发框架,实际上已经成为JavaEE项目开发标准。开发人员使用Spring Framework创建高性能、易于测试和可重用的代码。
Spring大约有20个模块,这些组件被分别整合在核心容器(Core Container)、AOP(Aspect Oriented Programming)和设备支持(Instrumentation)、数据访问及集成(Data Access/Integeration)、Web、报文发送(Messaging)、Test这6个模块集合中。Spring 5的模块结构如图1-1所示。
图1-1
Spring框架的模块可以独立存在,也可以几个模块进行组合,即可以通过一个或多个模块联合实现。各模块的组成和功能如下。
(1)核心容器:由spring-beans、spring-core、spring-context和spring-expression(Spring Expression Language,SpEL)4个模块组成。
spring-beans和spring-core模块是Spring框架的核心模块,包含了控制反转(Inversion of Control,IoC)和依赖注入(Dependency Injection,DI)。BeanFactory接口是Spring框架中的核心接口,是工厂模式的具体实现。BeanFactory使用控制反转对应用程序的配置和依赖性规范与实际的应用程序代码进行了分离,但是BeanFactory容器实例化后并不会自动实例化Bean,只有当Bean被使用时BeanFactory容器才会对该Bean进行实例化与依赖关系的装配。
spring-context模块构架于核心模块之上,扩展了BeanFactory,为它添加了Bean生命周期控制、框架事件体系以及资源加载透明化等功能。此外该模块还提供了许多企业级支持,如邮件访问、远程访问、任务调度等。ApplicationContext是该模块的核心接口,是BeanFactory的超类。与BeanFactory不同,ApplicationContext容器实例化后会自动对所有的单实例Bean进行实例化与依赖关系的装配,使之处于待用状态。
spring-expression模块是统一表达式语言(EL)的扩展模块,可以查询、管理运行中的对象,同时也可以方便地调用对象方法、操作数组、集合等。它的语法类似于传统EL,但是提供了额外的功能,最出色的要数函数调用和简单字符串的模板函数。这种语言的特性是基于Spring产品的需求而设计的,可以非常方便地同Spring IoC进行交互。
(2)面向切面编程:我们知道Java语言本身最重要的特性就是面向对象的编程,面向对象是实现具体业务时的一种思维方式。在实际项目中,有很多业务流程都包含了一些共性的模块,比如日志模块、数据库事务模块等。这种业务的设计会使用面向切面的编程思维,通俗点说就是将共性的业务拿出来做成对象,供所有业务流程共用。Spring框架提供了面向切面编程的能力,可以实现一些面向对象编程无法很好实现的操作,例如,将日志、事务与具体的业务逻辑解耦。其主要包含spring-aop、spring-aspects组件。spring-aop是Spring的另一个核心模块,是AOP主要的实现模块。作为继OOP后对程序员影响最大的编程思想之一,AOP极大地开拓了人们对于编程的思路。Spring以JVM的动态代理技术为基础,设计出一系列AOP横切实现,比如前置通知、返回通知、异常通知等,同时利用Pointcut接口来匹配切入点(既可以使用现有的切入点来设计横切面,也可以扩展相关方法根据需求进行切入)。
spring-aspects模块集成自AspectJ框架,主要是为Spring AOP提供多种AOP实现方法。spring-instrument模块是基于Java SE中的“java.lang.instrument”进行设计的,应该算是AOP的一个支援模块,主要作用是在JVM启用时生成一个代理类。程序员通过代理类在运行时修改类的字节,从而改变一个类的功能,实现AOP的功能。
(3)数据访问及集成:Spring自带了一组数据访问框架,集成了多种数据访问技术。不管直接使用JDBC,还是Hibernate、MyBatis这样的ORM框架,Spring都可以帮助我们消除持久化代码中单调枯燥的数据访问逻辑。Spring允许我们在持久层选择不同的方案,如JDBC、MyBatis、Hibernate、Java持久化API(Java Persistence API,JPA)以及NoSQL数据库。这部分框架由spring-jdbc、spring-tx、spring-orm、spring-jms和spring-oxm 5个模块组成。
· spring-jdbc模块:Spring提供的JDBC抽象框架的主要实现模块,用于简化Spring JDBC,主要提供JDBC模板方式、关系数据库对象化方式、SimpleJdbc方式、事务管理来简化JDBC编程,主要实现类是JdbcTemplate、SimpleJdbcTemplate以及NamedParameterJdbcTemplate。
· spring-tx模块:Spring JDBC事务控制实现模块,使用Spring框架,对事务做了很好的封装,通过AOP配置可以灵活地配置在任何一层。在很多的需求和应用中,直接使用JDBC事务控制还是有其优势的。事务是以业务逻辑为基础的,一个完整的业务应该对应业务层里的一个方法,如果业务操作失败,则整个事务回滚。所以,事务控制应该放在业务层。持久层的设计应该遵循一个很重要的原则:保证操作的原子性,即持久层里的每个方法都应该是不可分割的。所以,在使用Spring JDBC事务控制时,应该注意其特殊性。
· spring-orm模块:ORM框架支持模块,主要集成Hibernate、Java Persistence API(JPA)和Java Data Objects(JDO)用于资源管理、数据访问对象(DAO)的实现和事务策略。
· spring-jms模块(Java Messaging Service):能够发送和接收信息,自Spring Framework 4.1以后,还提供了对spring-messaging模块的支撑。
· spring-oxm模块:主要提供一个抽象层以支撑OXM(Object-to-XML-Mapping,是一个O/M-mapper,将Java对象映射成XML数据或者将XML数据映射成Java对象),例如JAXB、Castor、XMLBeans、JiBX和XStream等。
(4)Web模块:由spring-web、spring-webmvc、spring-websocket和spring-webflux 4个模块组成。
· spring-web模块:为Spring提供了最基础的Web支持,主要建立于核心容器之上,通过Servlet或者Listeners来初始化IoC容器,也包含一些与Web相关的支持。
· spring-webmvc模块:是一个Web-Servlet模块,实现了Spring MVC(Model-View-Controller)的Web应用。
· spring-websocket模块:主要是与Web前端的全双工通信协议。
· spring-webflux模块:是一个新的非堵塞函数式Reactive Web框架,可以用来建立异步、非阻塞、事件驱动的服务,并且扩展性非常好。
(5)报文发送:spring-messaging模块。
spring-messaging是从Spring 4开始加入的一个模块,主要职责是为Spring框架集成一些基础的报文传送应用。spring-messaging属于Spring Framework项目,其定义了Enterprise Integration Patterns典型实现的接口及相关的支持(注解、接口的简单默认实现等)。
消息系统中的Pipes and Filters模型如图1-2所示。模型主要由两部分组成:用来传递消息的通道(Pipe)和用来对消息进行处理的过滤器(Filter)。这些消息通道将过滤器串联起来,而消息自身则会沿着这些通道流动。
图1-2
图1-2中所显示的是对一个消息进行处理的典型方式。在一个消息被发送到一个管道中后,过滤器将会在具有消息处理能力时从输入管道中接收该消息并开始处理。一旦该消息处理完毕,过滤器就会把处理结果放到输出管道中,并由与该管道相连接的各个过滤器完成消息的后续处理。一个过滤器可能对消息进行处理,也可能仅仅是对消息进行转发。
spring-messaging定义了以下的接口用来实现Pipes and Filters模型:
· Message:消息,包含MessageHeaders和Payload。
· MessageChannel:Pipes and Filters模型中的Pipe,其中定义了用来发送消息到此Pipe的send方法。其根据MessageHandler中两种获取消息的方式定义了两个子接口:PollableChannel,用来表示支持拉模型的通道,其中定义了receive方法(用来支持MessageHandler主动拉取消息);SubscribableChannel,用来表示支持推模型(发布/订阅模型)的通道,其中定义了subscribe和unsubscribe方法(用来支持MessageHandler的订阅和取消订阅)。
· MessageHandler:Pipes and Filters模型中的Filter,定义了handleMessage方法用来处理消息。
由于在经典的Pipes and Filters模型中,过滤器的输入及输出只能有一个,因此其所包含的各个过滤器并不可以被多条处理逻辑重用。图1-3所示的Enterprise Integration Pattern模式放松了该约束,使得一个过滤器可以从多个管道接收消息,并向多个管道发送相同或不同的消息。
图1-3
spring-messaging定义了DestinationResolver接口,用来选择消息的目的地。消息的目的地既可以是Pipe(MessageChannel),也可以是Filter(MessageHandler)。
(6)测试(Test):spring-test模块。
spring-test模块主要是为测试提供支持的,毕竟在不需要发布(程序)到你的应用服务器或者连接到其他企业设施的情况下能够执行一些集成测试或者其他测试,对于任何企业来说都是非常重要的。
Spring的优点总结起来如下:
· 使用Spring的IoC容器,将对象之间的依赖关系交给Spring,降低组件之间的耦合性,让我们更专注于应用逻辑。
· 独立于各种应用服务器,基于Spring框架的应用,可以真正实现“Write Once,Run Anywhere”的承诺。
· Spring的AOP支持允许将一些通用任务(如安全、事务、日志等)进行集中式管理,从而提供了更好的复用。
· Spring的ORM和DAO提供了与第三方持久层框架的良好整合,并简化了底层的数据库访问。
· Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。
· Spring属于轻量级框架,开发不需要涉及大量接口,开发难度降低,而且不需要单独的容器对对象进行管理,资源消耗低。