5. Spring Framework 4.2 中的新功能和增强功能
4.2 版包括许多改进,如以下各节所述:
5.1 核心容器的改进
-
还可以在 Java 8 默认方法上检测并处理诸如
@Bean
之类的 Comments,从而可以从具有默认@Bean
方法的接口组成配置类。 -
配置类现在可以使用常规组件类声明
@Import
,从而允许混合使用导入的配置类和组件类。 -
配置类可能会声明一个
@Order
值,即使通过 Classpath 扫描检测到该值,也会以相应的 Sequences 进行处理(例如,按名称覆盖 Bean)。 -
@Resource
注入点支持@Lazy
声明,类似于@Autowired
,它接收请求的目标 bean 的延迟初始化代理。 -
现在,应用程序事件基础结构提供了annotation-based model以及发布任意事件的功能。
-
托管 Bean 中的任何公共方法都可以用
@EventListener
Comments 以使用事件。@TransactionalEventListener
提供事务绑定事件支持。
-
Spring Framework 4.2 引入了对声明和查找 Comments 属性别名的一流支持。新的
@AliasFor
注解可用于在单个注解中声明一对别名属性,或声明从自定义组合注解中的一个属性到元注解中的属性的别名。 -
@AliasFor
支持已对以下 Comments 进行了改进,以便为其value
属性提供有意义的别名:@Cacheable
,@CacheEvict
,@CachePut
,@ComponentScan
,@ComponentScan.Filter
,@ImportResource
,@Scope
,@ManagedResource
,@Header
,@Payload
,@SendToUser
,@ActiveProfiles
,@ContextConfiguration
,@Sql
18_,@Transactional
,@ControllerAdvice
,@CookieValue
,@CrossOrigin
,@MatrixVariable
,@RequestHeader
,@RequestMapping
,@RequestParam
,@RequestPart
,@ResponseStatus
,@SessionAttributes
,@ActionMapping
,@RenderMapping
,@EventListener
,@TransactionalEventListener
。- 例如,来自
spring-test
模块的@ContextConfiguration
现在声明如下:
- 例如,来自
public @interface ContextConfiguration {
@AliasFor("locations")
String[] value() default {};
@AliasFor("value")
String[] locations() default {};
// ...
}
-
类似地,从元 Comments 中覆盖属性的“组合 Comments”现在可以使用
@AliasFor
来精确控制在 Comments 层次结构中哪些属性被覆盖。实际上,现在可以为元 Comments 的value
属性声明别名。 -
例如,现在可以使用以下自定义属性重写来开发组合 Comments。
@ContextConfiguration
public @interface MyTestConfig {
@AliasFor(annotation = ContextConfiguration.class, attribute = "value")
String[] xmlFiles();
// ...
}
-
See SpringComments 编程模型.
-
对用于查找元 Comments 的 Spring 搜索算法进行了大量改进。例如,本地声明的“组合 Comments”现在比继承的 Comments 更受青睐。
-
现在,可以在接口,抽象,bridge 和接口方法以及类,标准方法,构造函数和字段上发现覆盖元 Comments 属性的“组合 Comments”。
-
可以将表示 Comments 属性(和
AnnotationAttributes
实例)的 Map“合成”(即转换)为 Comments。 -
基于字段的数据绑定(
DirectFieldAccessor
)的功能已与当前基于属性的数据绑定(BeanWrapper
)对齐。特别是,基于字段的绑定现在支持对 Collections,Arrays 和 Maps 的导航。 -
DefaultConversionService
现在为Stream
,Charset
,Currency
和TimeZone
提供了开箱即用的转换器。这样的转换器也可以单独添加到任意ConversionService
中。 -
DefaultFormattingConversionService
附带了对 JSR-354 货币和货币(如果 Classpath 中存在“ javax.money” API 的)中的值类型的现成支持:MonetaryAmount
和CurrencyUnit
。这包括对应用@NumberFormat
的支持。 -
@NumberFormat
现在可以用作元 Comments。 -
JavaMailSenderImpl
具有新的testConnection()
方法,用于检查与服务器的连接。 -
ScheduledTaskRegistrar
公开计划的任务。 -
现在,池 AOP
CommonsPool2TargetSource
支持 Apachecommons-pool2
。 -
引入
StandardScriptFactory
作为基于 JSR-223 的脚本化 bean 的机制,通过 XML 的lang:std
元素公开。支持例如 JavaScript 和 JRuby。 (注意:现在不建议使用 JRubyScriptFactory 和lang:jruby
,而建议使用 JSR-223.)
5.2 数据访问改进
-
现在通过 AspectJ 支持
javax.transaction.Transactional
。 -
SimpleJdbcCallOperations
现在支持命名绑定。 -
完全支持 Hibernate ORM 5.0:作为 JPA 提供程序(自动改编)以及通过其本机 API(由新的
org.springframework.orm.hibernate5
包覆盖)。 -
现在可以自动为嵌入式数据库分配唯一的名称,并且
<jdbc:embedded-database>
支持新的database-name
属性。有关更多详细信息,请参见下面的“测试改进”。
5.3 JMS 改进
-
autoStartup
属性可以通过JmsListenerContainerFactory
进行控制。 -
现在可以为每个侦听器容器配置回复
Destination
的类型。 -
@SendTo
注解的值现在可以使用 SpEL 表达式。 -
响应目标可以是使用 JmsResponse 在运行时计算
-
@JmsListener
现在是一个可重复的注解,用于以相同的方法声明多个 JMS 容器(如果尚未使用 Java8,则使用新引入的@JmsListeners
)。
5.4 Web 改进
-
HTTP 流和服务器发送事件支持,请参阅称为“ HTTP 流”的部分。
-
对 CORS 的内置支持,包括全局(MVC Java 配置和 XML 名称空间)和本地(例如
@CrossOrigin
)配置。有关详情,请参见第 27 章,CORS 支持。 -
HTTP 缓存更新:
-
新的
CacheControl
构建器;已插入ResponseEntity
,WebContentGenerator
,ResourceHttpRequestHandler
。WebRequest
中改进了 ETag/Last-Modified 支持。
-
使用
@RequestMapping
作为元 Comments 的自定义 MapComments。 -
AbstractHandlerMethodMapping
中的公共方法用于在运行时注册和注销请求 Map。 -
AbstractDispatcherServletInitializer
中受保护的createDispatcherServlet
方法可进一步自定义要使用的DispatcherServlet
实例。 -
HandlerMethod
作为@ExceptionHandler
方法的方法参数,在@ControllerAdvice
组件中特别方便。 -
java.util.concurrent.CompletableFuture
作为@Controller
方法的返回值类型。 -
HttpHeaders
中的字节范围请求支持以及用于提供静态资源。 -
在嵌套异常中检测到
@ResponseStatus
。 -
RestTemplate
中的UriTemplateHandler
扩展点。 -
DefaultUriTemplateHandler
公开baseUrl
属性和路径段编码选项。- 扩展点还可以用于插入任何 URI 模板库。
-
OkHTTP与
RestTemplate
集成。 -
自定义
baseUrl
替代MvcUriComponentsBuilder
中的方法。 -
序列化/反序列化异常消息现在以 WARN 级别记录。
-
默认 JSON 前缀已从“{} &&”更改为更安全的“)]}',”一。
-
新的
RequestBodyAdvice
扩展点和内置实现支持@RequestBody
方法参数上的 Jackson 的@JsonView
。 -
当使用 GSON 或 Jackson 2.6 时,处理程序方法返回类型用于改善
List<Foo>
之类的参数化类型的序列化。 -
引入
ScriptTemplateView
作为基于 JSR-223 的脚本化 Web 视图的机制,重点关注基于 Nashorn 的 JavaScript 视图模板(JDK 8)。
5.5 WebSocket 消息传递的改进
-
公开有关已连接用户和订阅的状态信息:
-
新的
SimpUserRegistry
公开为名为“ userRegistry”的 bean。- 在服务器集群之间共享状态信息(请参阅代理中继配置选项)。
-
在服务器集群之间解析用户目标(请参阅代理中继配置选项)。
-
StompSubProtocolErrorHandler
扩展点用于自定义和控制 Client 端的 STOMP ERROR 帧。 -
通过
@ControllerAdvice
个组件的全局@MessageExceptionHandler
个方法。 -
带有
SimpleBrokerMessageHandler
的订阅的心跳和 SpEL 表达式“selectors”Headers。 -
用于 TCP 和 WebSocket 的 STOMPClient 端;参见第 26.4.15 节,“ STOMPClient 端”。
-
@SendTo
和@SendToUser
可以包含目标变量占位符。 -
Jackson 的
@JsonView
支持@MessageMapping
和@SubscribeMapping
方法的返回值。 -
ListenableFuture
和CompletableFuture
作为@MessageMapping
和@SubscribeMapping
方法的返回值类型。 -
MarshallingMessageConverter
用于 XML 有效负载。
5.6 测试改进
-
现在,可以使用 JUnit 规则而不是
SpringJUnit4ClassRunner
来执行基于 JUnit 的集成测试。这允许基于 Spring 的集成测试可以与 JUnit 的Parameterized
之类的替代运行程序或MockitoJUnitRunner
之类的第三方运行程序一起运行。 -
有关详情,请参见“ Spring JUnit 4 规则”一节。
-
Spring MVC Test 框架现在提供对 HtmlUnit 的一流支持,包括与 Selenium 的 WebDriver 集成,从而允许基于页面的 Web 应用程序测试,而无需部署到 Servlet 容器。
-
有关详情,请参见第 15.6.2 节“ HtmlUnit 集成”。
-
AopTestUtils
是一种新的测试 Util,允许开发人员获取对隐藏在一个或多个 Spring 代理之后的基础目标对象的引用。 -
有关详情,请参见第 14.2.1 节“常规测试 Util”。
-
ReflectionTestUtils
现在支持设置和获取static
字段,包括常量。 -
现在保留通过
@ActiveProfiles
声明的 Bean 定义配置文件的原始 Sequences,以支持诸如 Spring Boot 的ConfigFileApplicationListener
之类的用例,这些用例基于活动配置文件的名称加载配置文件。 -
@DirtiesContext
支持新的BEFORE_METHOD
,BEFORE_CLASS
和BEFORE_EACH_TEST_METHOD
模式,用于*在测试之前关闭ApplicationContext
-例如,如果大型测试套件中的某些恶意测试(即,尚未确定)破坏了ApplicationContext
的原始配置。 -
@Commit
是一个新 Comments,可以直接替代@Rollback(false)
。 -
@Rollback
现在可以用于配置类级别的* default rollback *语义。 -
因此,
@TransactionConfiguration
现在已被弃用,并将在后续发行版中删除。 -
@Sql
现在支持通过新的statements
属性执行内联 SQL 语句。 -
现在,用于在测试之间缓存
ApplicationContext
的ContextCache
现在是具有默认实现的公共 API,可以将其替换为自定义缓存需求。 -
DefaultTestContext
,DefaultBootstrapContext
和DefaultCacheAwareContextLoaderDelegate
现在是support
子程序包中的公共类,允许自定义扩展。 -
TestContextBootstrapper
现在负责构建TestContext
。 -
在 Spring MVC 测试框架中,现在可以在
DEBUG
级别记录MvcResult
详细信息或将其写入自定义OutputStream
或Writer
。有关详细信息,请参见MockMvcResultHandlers
中新的log()
,print(OutputStream)
和print(Writer)
方法。 -
JDBC XML 名称空间在
<jdbc:embedded-database>
中支持新的database-name
属性,从而使开发人员可以设置嵌入式数据库的唯一名称,例如,通过 SpEL 表达式或受当前活动 bean 定义配置文件影响的属性占位符。 -
现在可以自动为嵌入式数据库分配一个唯一的名称,从而允许在测试套件中的不同
ApplicationContext
中重用通用的测试数据库配置。 -
有关详情,请参见第 19.8.6 节“为嵌入式数据库生成唯一名称”。
-
MockHttpServletRequest
和MockHttpServletResponse
现在通过getDateHeader
和setDateHeader
方法提供了对日期 Headers 格式的更好支持。