Spring框架宗旨:不重复造轮子,让原有技术使用起来更加方便。
一、Spring Framework的整体架构
Spring Framework总共有十几个组件,其中核心组件只有三个:Core、Context 和 Beans。
Spring Framework 3.x 的总体架构图
组成 Spring Framework的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
Spring Core(核心容器):核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring Context(上下文):Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如:JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
Spring Web模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
Spring MVC框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
从图中可以看出,IOC 的实现包 spring-beans 和 AOP 的实现包 spring-aop 也是整个框架的基础,而 spring-core 是整个框架的核心,基础的功能都在这里。
在此基础之上,spring-context 提供上下文环境,为各个模块提供粘合作用。
在 spring-context 基础之上提供了 spring-tx 和 spring-orm包,而web部分的功能,都是要依赖spring-web来实现的。
Spring Framework 4.x 的系统架构图
Spring Framework 4.x对比Spring Framework 3.2.x的系统架构变化:
从图中可以看出,总体的层次结构没有太大变化,变化的是 Spring 4.0.3去掉了 struts 模块(spring-struts包)。现在的 Spring mvc的确已经足够优秀了,大量的 web 应用均已经使用了 Spring mvc。而 struts1.x 的架构太落后了,struts2.x 是 struts 自身提供了和 Spring 的集成包,但是由于之前版本的 struts2 存在很多致命的安全漏洞,所以,大大影响了其使用度,好在最新的2.3.16版本的 struts 安全有所改善,希望不会再出什么大乱子。
web 部分去掉了 struts 模块,但是增加 WebSocket 模块(spring-websocket包),增加了对 WebSocket、SockJS 以及 STOMP 的支持,它与 JSR-356 Java WebSocket API 兼容。另外,还提供了基于 SockJS(对 WebSocket 的模拟)的回调方案,以适应不支持 WebSocket 协议的浏览器。
同时,增加了 messaging 模块(spring-messaging),提供了对 STOMP 的支持,以及用于路由和处理来自 WebSocket 客户端的 STOMP 消息的注解编程模型。spring-messaging 模块中还 包含了 Spring Integration 项目中的核心抽象类,如 Message、MessageChannel、MessageHandler。
删除过时的包和方法。第三方类库至少使用2010/2011年发布的版本,尤其是Hibernate 3.6+, EhCache 2.1+, Quartz 1.8+, Groovy 1.8+, and Joda-Time 2.0+。Hibernate Validator要求使用4.3+,Jackson 2.0+。
Java 8支持。当然也支持Java6和Java7,但最好在使用Spring框架3.X或4.X时,将JDK升级到Java7,因为有些版本至少需要Java7。
Java EE 6和7。使用Spring4.x时Java EE版本至少要6或以上,且需要JPA 2.0和Servlet 3.0 的支持,所以服务器,web容器需要做相应的升级。一个更具前瞻性的注意是,Spring4.0支持J2EE 7的适用级规范,比如JMS 2.0, JTA 1.2, JPA 2.1, Bean Validation 1.1和JSR-236并发工具包,在选择这些jar包时需要注意版本。
核心容器提升等等。
二、Spring相关的jar包
org.springframework | spring-aop | 基于代理的AOP支持 |
org.springframework | spring-aspects | 基于AspectJ 的切面编程 |
org.springframework | spring-beans | Beans的支持, 包括 Groovy |
org.springframework | spring-context | 应用程序运行时上下文,包括调度和远程抽象 |
org.springframework | spring-context-support | 提供第三方库到Spring的支持 |
org.springframework | spring-core | 核心工具类,被其他模块使用 |
org.springframework | spring-expression | Spring 表达式语言 (SpEL) |
org.springframework | spring-instrument | 代理JVM相关的 |
org.springframework | spring-instrument-tomcat | Tomcat的插件 |
org.springframework | spring-jdbc | 提供jdbc的支持,包括数据源和JDBC访问 |
org.springframework | spring-jms | JMS支持包,包括接收和发送消息类的支持 |
org.springframework | spring-messaging | 对消息传递体系结构和协议的支持 |
org.springframework | spring-orm | 对象/关系 映射, 拨快对JPA 和 Hibernate的支持 |
org.springframework | spring-oxm | 对象/XML 映射的支持 |
org.springframework | spring-test | 对Spring组件单元测试和集成测试的支持 |
org.springframework | spring-tx | 事务支持,包块DAO支持和JCA集成 |
org.springframework | spring-web | Web 支持,包括客户端和Web访问 |
org.springframework | spring-webmvc | 一个MVC框架 |
org.springframework | spring-websocket | WebSocket 和SockJS 的实现,包括对STOMP的支持 |
三、核心功能
- IoC/DI :控制反转/依赖注入
- AOP:面向切面编程
- 声明式事务
四、Spring各版本的特性
Spring3.1
- 添加了引入环境profile功能
- 添加了@enable注解,使用特定功能
- 添加了对声明式缓存的支持,能够使用简单的注解声明缓存边界和规则
- 添加的用于构造器注入的c命名空间,类似与Spring2的p命名空间,用于对应属性注入
- 开始支持Servlet3.0,包括基于java配置中生命Servlet和Filter,不再只仅仅借助web.xml
- 改善对于JPA的支持,让JPA能在Spring中完整配置JPA,不必再使用persistence.xml文件
- 自动绑定路径变量到模型属性中
- 提供了@RequestMappingProduces和consumes属性,用于匹配请求中的Accept和Content-Type头部信息
- 提供了@RequestPart注解,用于将Multipart请求中的而某些部分绑定到处理器的方法参数中
- 持Flash属性,在redirect请求后依然能够存活的属性,flash属性的RedirectAttribute类型
- 为支持原生的EntityManager,Spring的JpaTemplate和JpaDaoSupport类已被废弃了来支持JPA 2.0,并在spring4中移除了
Spring3.2
- @Autowired.@Value和@Bean注解能够作为元注解,用于创建自定义的注入和bean声明注解
- @DateTimeFormat注解不再依赖JodaTime.如果提供了JodaTime,就会使用它,否则的话,会使用SimpleDateFormat;
- Spring的声明式缓存提供了对JCache0.5的支持
- 支持定义全局的格式来解析和渲染日期和时间
- 在集成测试中,能够配置和加载WebApplicationContext
- 在集成测试中,能够针对request和session作用域的bean进行测试
Spring4.0
- Spring提供了对WebSocket编程的支持,包括支持JSR-356--Java API for WebSocket
- 鉴于WebSocket仅仅提供了一种低层次的API,急需高层次的抽象,因此Spring4.0在WebSocket之上提供了一个高层次的面向消息的编程模型,
- 该模型基于SockJS,并且包含了对STOMP协议的支持
- 新的消息模块,很多的类型来源于Spring Integration项目。这个消息模块支持Spring的SockJS/STOMP功能,同时提供了基于模板的方式发布消息
- Spring是第一批支持Java8特性的Java框架,比如它所支持的lambda表达式,别的暂且不说,这首先能够让使用特定的毁掉接口更加简洁,代码更加易读
- 与Java8 同时得到支持的是JSR-310--Date与Time API,在处理时间和日期时,他为开发者提供了java.util.Date或java.util.Calendar更丰富的API
- 为Groovy开发的应用程序提供了更加顺畅的编程体验,尤其是支持非常便利地完全采用Groovy开发Spring应用程序。随这些一起提供的是来自于Grails
- 的BeanBuilder,借助它能够通过Groovy配置Spring应用
- 添加了条件化创建bean的功能,在这里只有开发人员定义的条件满足时,才会创建所声明的bean
- Spring4.0包含了Spring RestTemplate的一个新的异步实现,它会立即返回并且允许在操作完成后执行回调
- 添加了对多项JEE规范的支持,包括JMS2.0.JTA1.2.JPA2.1和Bean Validation1.1
Spring5.0
Spring Framework 5.0 新特性 (请关注常规升级,说明了一些工具要求的最低版本) 本系列教程以 5.1.16.RELEASE 版本进行说明。
官网:https://spring.io/projects/spring-framework#learn
说明文档:https://docs.spring.io/spring/docs/5.1.16.RELEASE/spring-framework-reference/
中文文档:https://www.cntofu.com/book/95/index.html