Spring 框架第一个版本发布于 2004 年,自发布以来已历经三个主要版本更新: Spring 2.0 提供了 XML 命名空间和 AspectJ 支持;Spring 2.5 增加了注释驱动(annotation-driven)的配置支持; Spring 3.0增加了对 Java 5+ 版本的支持和 @Configuration
模型。
Spring 4.0 是最新的主要版本,并且首次完全支持 Java 8 的特性。你仍然可以使用老版本的 Java,但是最低版本的要求已经提高到 Java SE 6。我们也借主要版本更新的机会删除了许多过时的类和方法。
你可以在Spring Framework GitHub Wiki上查看 升级 Spring 4.0 的迁移指南。
新的 spring.io 网站提供了一整个系列的 "入门指南" 帮助你学习 Spring。你可以本文档的 1. Getting Started with Spring 一节阅读更多的入门指南。新网站还提供了Spring 之下其他额外项目的一个全面的概述。
如果你是一个 Maven 用户,你可能会对 BOM 这个有用的 POM 文件感兴趣, 这个文件已经与每个 Spring 的发布版发布。
所有过时的包和许多过时的类和方法已经从Spring4中移除。如果你从之前的发布版升级Spring,你需要保证已经修复了所有使用过时的API方法。
查看完整的变化: API差异报告。
请注意,所有可选的第三方依赖都已经升级到了最低2010/2011(例如Spring4 通常只支持 2010 年的最新或者现在的最新发布版本):尤其是 Hibernate 3.6+、EhCache 2.1+、Quartz 1.8+、Groovy 1.8+、Joda-Time 2.0+。但是有一个例外,Spring4依赖最近的Hibernate Validator 4.3+,现在对Jackson的支持集中在2.0+版本 (Spring3.2支持的Jackson 1.8/1.9,现在已经过时)。
Spring4 支持 Java8 的一些特性。你可以在 Spring 的回调接口中使用 lambda 表达式 和 方法引用。支持java.time
(JSR-310)的值类型和一些改进过的注解,例如 @Repeatable
。你还可以使用 Java8 的参数名称发现机制(基于-parameters
编译器标志)。
Spring 仍然兼容老版本的 Java 和 JDK:Java SE 6(具体来说,支持JDK6 update 18 )以上版本,我们建议新的基于 Spring4 的项目使用Java7或Java8。
Java EE 6 或以上版本是 Spring4 的底线,与 JPA2.0 和 Servlet3.0规范有着特殊的意义。为了保持与 Google App Engine 和旧的应用程序服务器兼容,Spring4 可以部署在 Servlet2.5 运行环境。但是我们强烈的建议您在 Spring 测试和模拟测试的开发环境中使用 Servlet3.0+。
如果你是WebSphere 7的用户,一定要安装JPA2.0功能包。在WebLogic 10.3.4或更高版本,安装附带的JPA2.0补丁。这样就可以将这两种服务器变成Spring4兼容的部署环境。
从长远的观点来看,Spring4.0 现在支持 Java EE 7 级别的适用性规范:尤其是 JMS 2.0, JTA 1.2, JPA 2.1, Bean Validation 1.1 和JSR-236 并发工具类。像往常一样,支持的重点是独立的使用这些规范。例如在 Tomcat 或者独立环境中。但是,当把 Spring 应用部署到 Java EE 7 服务器时它同样适用。
注意,Hibernate 4.3 是 JPA 2.1 的提供者,因此它只支持 Spring4。同样适用用于作为 Bean Validation 1.1 提供者的 Hibernate Validator 5.0。这两个都不支持 Spring3.2。
Spring4.0 支持使用 Groovy DSL 来进行外部的 bean 定义配置。这在概念上类似于使用 XML 的 bean 定义,但是支持更简洁的语法。使用Groovy 还允许您轻松地将 bean 定义直接嵌入到引导代码中。例如:
def reader = new GroovyBeanDefinitionReader(myApplicationContext)
reader.beans {
dataSource(BasicDataSource) {
driverClassName = "org.hsqldb.jdbcDriver"
url = "jdbc:hsqldb:mem:grailsDB"
username = "sa"
password = ""
settings = [mynew:"setting"]
}
sessionFactory(SessionFactory) {
dataSource = dataSource
}
myService(MyService) {
nestedBean = { AnotherBean bean ->
dataSource = dataSource
}
}
}
有关更多信息,请参阅 GroovyBeanDefinitionReader
javadocs
Repository
你可以方便的插入特定的实现:@Autowired Repository customerRepository
。@Order
注解和Ordered
接口两种方式。 @Lazy
注解现在可以用在注入点以及@Bean
定义上。@Description
注解,开发人员可以使用基于Java 方式的配置。@Conditional
注解加入。这和@Profile
支持的类似,但是允许以编程式开发用户定义的策略。LocaleContext
。现在仍然可以部署到 Servlet 2.5 服务器,但是 Spring4.0 现在主要集中在 Servlet 3.0+ 环境。如果你使用Spring MVC 测试框架,你需要将 Servlet 3.0 兼容的 JAR 包放到 测试的 classpath 下。
除了稍后会提到的 WebSocket 支持外,下面的常规改进已经加入到Spring 的 Web 模块:
@RestController
注解,不在需要给@RequestMapping
的方法添加@ResponseBody
注解。一个新的 spring-websocket
模块提供了全面的基于 WebSocket 和在Web 应用的客户端和服务器之间双向通信的支持。它和 Java WebSocket API JSR-356 兼容,此外还提供了当浏览器不支持 WebSocket 协议时 (如 Internet Explorer < 10)的基于SockJS 的备用选项(如 WebSocket emulation)。
一个新的spring-messaging
模块添加了支持 STOMP 作为 WebSocket 子协议用于在应用中使用注解编程模型路由和处理从 WebSocket 客户端发送的 STOMP 消息。由于@Controller
现在可以同时包含@RequestMapping
和@MessageMapping
方法用于处理 HTTP 请求和来自 WebSocket 连接客户端发送的消息。新的spring-messaging
模块还包含了来自以前 Spring 集成项目的关键抽象,例如Message
、MessageChannel
、MessageHandler
和其他作为基于消息传递的应用程序的基础。
欲知详情以及较全面的介绍,请参见Chapter 20, WebSocket 支持一节。
除了精简spring-test
模块中过时的代码外,Spring 4 还引入了几个用于单元测试和集成测试的新功能。
spring-test
模块中所有的注解(例如:@ContextConfiguration
、@WebAppConfiguration
、@ContextHierarchy
、@ActiveProfiles
等等)现在可以用作元注解来创建自定义的 composed annotations 并且可以减少测试套件的配置。SocketUtils
类被引入到了spring-core
模块。这个类可以使你能够扫描本地主机的空闲的 TCP 和 UDP 服务端口。这个功能不是专门用在测试的,但是可以证明在你使用 Socket 写集成测试的时候非常有用。例如测试内存中启动的SMTP服务器,FTP服务器,Servlet容器等。org.springframework.mock.web
包中的一套mock是基于Servlet 3.0 API。此外,一些Servlet API mocks(例如:MockHttpServletRequest
、MockServletContext
等等)已经有一些小的改进更新,提高了可配置性。Spring 4.1 引入了一个更简单的基础架构,使用 @JmsListener
注解bean 方法来注册 JMS 监听端点。XML 命名空间已经通过增强来支持这种新的方式(jms:annotation-driven
),它也可以完全通过Java配置(@EnableJms
, JmsListenerContainerFactory
)来配置架构。也可以使用 JmsListenerConfigurer
注解来注册监听端点。
Spring 4.1 还调整了 JMS 的支持,使得你可以从spring-messaging
在 Spring4.0 引入的抽象获益,即:
@Payload
、@Header
、@Headers
和@SendTo
注解。另外,也可以使用一个标准的消息,以代替javax.jms.Message
作为方法参数。JmsMessageOperations
接口和允许操作使用Message
抽象的JmsTemplate
。最后,Spring 4.1提供了其他各种各样的改进:
元素BackOff
实现进行配置Spring 4.1 支持JCache (JSR-107)注解使用Spring的现有缓存配置和基础结构的抽象;使用标准注解不需要任何更改。
Spring 4.1也大大提高了自己的缓存抽象:
CacheResolver
解决。因此使用value
参数定义的缓存名称不在是强制性的。@CacheConfig
类级别注解允许在类级别上共享常用配置,不需要启用任何缓存操作。CacheErrorHandler
更好的处理缓存方法的异常Spring 4.1为了在CacheInterface
添加一个新的putIfAbsent
方法也做了重大的更改。
ResourceHttpRequestHandler
的资源处理已经扩展了新的抽象ResourceResolver
,ResourceTransformer
和ResourceUrlProvider
。一些内置的实现提供了版本控制资源的 URL(有效的 HTTP 缓存),定位 gzip 压缩的资源,产生 HTML5 AppCache清单,以及更多的支持。参见第17.16.7,“Serving of Resources(服务资源)”。java.util.Optional
现在支持@RequestParam
,@RequestHeader
和@MatrixVariable
控制器方法的参数。ListenableFuture
支持作为返回值替代DeferredResult
所在的底层服务(或者调用AsyncRestTemplate
)已经返回ListenableFuture
。@ModelAttribute
方法现在依照相互依存关系的顺序调用。见SPR-6299。@JsonView
被直接支撑在@ResponseBody
和ResponseEntity
控制器方法用于序列化不同的细节对于相同的 POJO(如摘要与细节页)。同时通过添加序列化视图类型作为模型属性的特殊键来支持基于视图的渲染。见Jackson Serialization View Support(Jackson序列化视图支持)@ResponseBody
和ResponseEntity
方法。要充分利用声明@ControllerAdvice
bean 实现ResponseBodyAdvice
。为@JsonView
和 JSONP 的内置支持利用这一优势。参见第17.4.1,“使用HandlerInterceptor 拦截请求”。HttpMessageConverter
选项:
jackson-dataformat-xml
在 classpath, 默认情况下使用@EnableWebMvc
或
,这是,而不是JAXB2。@RequestMapping
。例如FooController
的方法与handleFoo
被命名为“FC#handleFoo”。命名策略是可插拔的。另外,也可以通过其名称属性明确命名的@RequestMapping
。在Spring JSP标签库的新mvcUrl
功能使这个简单的JSP页面中使用。参见第17.7.2,“Building URIs to Controllers and methods from views”ResponseEntity
提供了一种 builder 风格的 API 来指导控制器向服务器端的响应的展示,例如,ResponseEntity.ok()。RequestEntity
是一种新型的,提供了一个 builder 风格的 API 来引导客户端的 REST 响应 HTTP 请求的展示。GroovyMarkupConfigurer
和各自的ViewResolver
和“视图”的实现。SockJsClient
和在相同包下的其他类.SessionSubscribeEvent
和 SessionUnsubscribeEvent
, 用于STOMP客户端的订阅和取消订阅.@SendToUser
仅仅靠一个会话就可以命中, 而不一定需要一个授权的用户.@MessageMapping
方法使用 . 来代替 / 作为目录分隔符。查看 SPR-11660.。MessageHeaderAccessor
的java文档。ApplicationContext
配置,在TestContext框架中整合测试。the section called “Context configuration with Groovy scripts”TestTransaction
接口,使用编程化来开始结束测试管理事务。the section called “Programmatic transaction management”Sql
和SqlConfig
注解申明在每一个类和方法中。the section called “Executing SQL scripts”@TestPropertySource
注解来自动覆盖系统和应用的属性值。the section called “Context configuration with test property sources”。TestExecutionListeners
现在可以自动被发现。the section called “Automatic discovery of default TestExecutionListeners” 。TestExecutionListeners
现在可以通过默认的监听器自动合并。the section called “Merging TestExecutionListeners”。MockServletContext
、MockHttpServletRequest
和其他servlet接口mocks等诸多改善。AssertThrows
重构后,Throwable
代替Exception
。MockMvcBuilder
现在可以在MockMvcConfigurer
的帮助下创建。MockMvcConfigurer
的加入使得Spring Security的设置更加简单,同时使用于任何第三方的普通封装设置或则仅仅在本项目中。MockRestServiceServer
现在支持AsyncRestTemplate
作为客户端测试。SessionSubscribeEvent
和 SessionUnsubscribeEvent
,用于STOMP客户端的订阅和取消订阅.public@interface ContextConfiguration {
@AliasFor("locations")
String[] value() default {};
@AliasFor("value")
String[] locations() default {};
// ...
}
* 同样, 组合注解(composed annotations)从元注解覆盖的属性,现在可以使用 @AliasFor 进行细粒度控制哪些属性是覆盖在一个注释的层次结构。事实上,现在可以声明一个别名给元注释的 value 属性。 * 例如,开发一个组合注解用于一个自定义的属性的覆盖
@ContextConfigurationpublic@interface MyTestConfig {
@AliasFor(annotation = ContextConfiguration.class, attribute = "value")
String[] xmlFiles();
// ...
}
*
见 [Spring Annotation Programming Model](http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#annotation-programming-model)
lang:std
元素暴露。支持如 JavaScript 和 JRuby。(注意:JRubyScriptFactory 和 lang:jruby
现在不推荐使用了 , 推荐用 JSR-223)
支持新的 database-name 属性。见下面“测试改进”内容{}&&
改为更安全的)]}’,
List
的 database-name 属性,允许开发人员为嵌入式数据库设置独特的名字——例如,通过一个 SpEL 表达式或 前活动bean定义配置文件所影响的占位符属性