spring4.X 的更新大全

PartII :spring 4.0的更新

4. spring 4.1的提高和改善

4.1 JMS 提高

spring4.1引进了一个更简单的组件去注册JMS监听端点,及使用@JmsListener注解;这个XML命名空间已经提高为支持注解驱动风格,你能够彻底使用用java config来进行配置(在@Config类里用@EnableJms,JmsListenerContainerFactory).你也可使用JmsListenerConfigurer类来用程序注册监听端点; spring4.1还调整了4.0中引进的spring4.0的spring-messaging 抽象,让你继续享受其便利;html

  • 消息监听器端点能够有一个更灵活的签名,并从消息注解中获益,如@payload,@Headers,@Headers,@SendTO.它还可使用标准的Message来替代javax.jms.Message做为方法参数
  • 提供了一个新的JmsMessageOperations接口,并容许JmsTemplate使用Message抽象进行操做 最后,spring4.1提供了额外的五花八门的改进
  • 在JmsTemplate中进行同步的请求回复操做支持
  • 监听器的优先级能够指定每一个jms:listenter/元素
  • JMS2.0 能够共享消费者
  • 消息监听器容器的恢复选项经过是用BackOff的实现来配置;

4.2 缓存改善

spring 4.1 经过使用已存在的缓存配置和框架抽象支持Jcache(JSR-107)注解;所以在使用时无需其余改变; spring 4.1也显著改善了本身的缓存抽象;前端

  • 能够经过CacheResolver释放缓存;所以定义缓存名称来使用再也不是强制的;
  • 更多操做级别的自定义:缓存解析器,缓存管理器,键值生成器
  • 一个新的@CacheConfig 类级别的注解;提供类别的共享而无需缓存操做;
  • 在使用CacheErrorHandler时会有更好的缓存方法异常处理; 因为添加了新的方法putIfAvsent,spring4.1在缓存上有了冲破性提高;

4.3 Web Improvements (web 提高)

  • 对原来处理资源的ResourceRequestHandler扩展为新的抽象ResourceResolver,resourceTransformer,ResourceUrlProvider.经过一些内置的实现提供了对版本化资源URLS(对于高效的http缓存),gzipped压缩定位资源,生成必定H5的应用缓存表现,还有更多.具体参见 Section 22.16.9, “Serving of Resources”;java

  • jdk 1.8的java Optional类的使用;@RequestParam,@RequestHeader,@MatriVariable等注解做为控制器方法参数的类型web

  • ListenableFuture 已被列为DeferredResult返回值的一个可选项,当其 一个下属的服务(又或者 对AsyncRestTemplate的调用)已返回ListenableFuture 值;算法

  • @ModelAttribute 的方法在调用时会考虑内置依赖问题的顺序问题spring

  • 加了@ResponseBody和ResponseEntity控制器支持Jackson的@JsonView,它能够序列化同一个POJO类的不一样细节.经过在特定的关键字下,添加序列化视图类型做为一个model的参数,它会支持改视图渲染.具体细节参见 the section called "Jackson Serialization View Support" ;sql

  • JSONP如今支持Jackson;查看 the section called “Jackson JSONP Support”.数据库

  • 一个新的生命周期选型:在@ResponseBody和ResponseEntity方法返回结果以后,response写出以前.利用@ConrollerAdvice bean来实现ReponseBodyAdvice接口.利用它们来实现@JsonView和JSONP;具体参见22.4.1 经过处理拦截器拦截请求;编程

  • 这里有三个新的HttpMessageConverter选项json

  • Gson 比Jackson占用的空间更轻;已在Spring Android项目中使用

  • Google Protocol Buffers (Google 协议缓存)简洁高效的企业级内置服务通讯数据协议;却能够为浏览器导出JSON和xml数据;

  • 经过jackson-dataformat-xml扩展,能够支持基于Jackson的xml序列化;当你使用@EnableWebmvc或添加mvc:annotation-driver/时,若是你的根目录有jackson-dataformat-xml时,它就会默认取代JAXB2(java Architecutrue for xml Binding,java和xml相互转化).

  • 视图和控制器之间的连接能够经过名字映射.每一个@RequestMapping 都会制定一个默认的名字;例如:FooController里的handleFoo方法的命名为'FC#handleFoo'.这个命名策略是可插拔的.它也能够用@RequestMapping的名称属性进行详细命名.一个新在Spring JSP标签库的mvcUrl的函数使得它在JSP页面能够轻易使用;详情可见从视图中建立链接指向前端控制器和方法;

  • ResponseEntity提供了一个构造器风格的API来指导控制器方法进行服务器端的Rest回应.例如ResponseEntity.ok();

  • RequestEntity 是一个新类型,它提供了一个构造器风格的API,能够指导客户端 REST代码发起 http请求.

  • MVC的java配置和xml命名空间 1.视图渲染其包括视图协商均可以配置; 见视图渲染部分 2.视图控制器内置了对重定向和返回状态设置的支持.一个应用能够用它来配置重定向的URLS,提供了带视图的404回应,发送了一个"no content"回应; 3.路径自定义匹配常用,然如今已内置;

  • Groovy markup template 支持(基于Groovy 2.3).查看GroovyMarkupConfigurer,表现层视图渲染,'View'实现;

4.4 WebSocket Messageing improvement

  • SockJs 客户端支持;在该包下查看SockJsClient及其相关的类
  • 发布了新的应用上下文事件-SessionSubscribeEvent和SessionUnsubscribeEvent事件;当STOMP客户端订阅或退订时;
  • 新的"websocket"做用域;查看 Section 26.4.14, “WebSocket Scope”
  • @SendToUser 只针对一个session,且没必要须是经过认证的用户
  • @MessageMapping 方法可用使用符号-'.'来替代斜线--'/'做为路径分隔符;查看 SPR-11660
  • STOMP/WebSocket 监控信息收集和记录;查看Section 26.4.16,"Runtion Monitoring"
  • 日志获得了显著的提高和优化,使其在Debug级别都保持可读性和简洁性;
  • 改善消息新建;支持临时变变消息,避免自动消息id和timestamp creation.查看MessageHeaderAccessr的注释文档
  • 当WebScoket会话创建以后,若是60秒内没有活动,就能够关闭该连接;

4.5 测试模块的优化

  • Groovy 脚本能够在TestContext框架里配置为集成测试加载的ApplicationContext;具体细节参照the section called “Context configuration with Groovy scripts”
  • 新的TestTransaction API,经过它你能够以编程方式开始和关闭你事务 测试方法中的测试管理事务 ; 查看编程事务管理部分;
  • sql脚本执行能够经过新的@Sql和@SqlConfig注解进行声明式配置,它做用于每一个类和方法之上; 执行sql脚本
  • 测试属性资源能够经过新的@TestPropertySource注解进行配置系统和应用的属性资源;
  • 默认的TestExecutionListener 能够被自动发现
  • TestContext框架对事务测试支持的文档经过详细的解释和额外的例子获得了提高;
  • 对于MockServletContext,MockHttpServletRequest,其余Servlet APi模拟的的提高
  • AssertThrows如今能够支持Throwable,而不仅是Exception;
  • 在spring MVC测试中,可使用JSON Assert基于JSONPath进行判断不是基于XML;
  • MockMVcBuilder 类,如今能够在MockMvcConfigurer帮助下新建;它能够将在项目里的第三方的框架调用Spring security 框架封装为公共的方法
  • MockRestServiceServer 如今支持对客户端测试的AsyncRestTemplate服务

4.2的新特性

5.1核心容器(Core Container)

  • 在jdk8下方法的一些注解如@Bean能够进行检测和处理,这样你能够用带@Bean的方法组成一个实现配置接口的配置类

  • 配置类可使用@Import注解,支持混合引入配置classes和组件class;

  • 配置文件可使用@Order配置值,当路径扫描时它们会按顺序进行处理;

  • @Resource 注入如今也支持懒加载(@Lazy)注解,和@Autowired同样,它将收到一个请求目标bean的懒启动代理;

  • 应用事件设施如今提供了基于注解的模式,能够发布任意事件; 1.任意在管理的Bean里的public方法只要标志为@EventListener,便可消费事件; 2.@TransactionalEventListener注解提供了事务边界内事件支持

  • 注解属性别名支持:@AliasFor:做用于自定义注解里,支持为值属性指定一些有意义的别名; 1.支持的注解有:@Cacheable, @CacheEvict, @CachePut, @ComponentScan, @ComponentScan.Filter, @ImportResource, @Scope, @ManagedResource, @Header, @Payload, @SendToUser, @ActiveProfiles, @ContextConfiguration, @Sql, @TestExecutionListeners, @TestPropertySource, @Transactional, @ControllerAdvice, @CookieValue, @CrossOrigin, @MatrixVariable, @RequestHeader, @RequestMapping, @RequestParam, @RequestPart, @ResponseStatus, @SessionAttributes, @ActionMapping, @RenderMapping, @EventListener, @TransactionalEventListener

    2.例如,在spring-test部分里的@ContextConfiguration能够以下定义:

public @interface ContextConfiguration{
	  @AliasFor("locations")
	  String[] value() default{};
	  @AliasFor("value")
	  String[]locations() default{};
  }

3.一样的,它也能够用在自定义组合注解里,用于在一个注解层次里确切的指定一个属性值;实际上,如今能够为value值申明一个注解;

4.例如,一个可使用@AliasFor进行自定义注解

@ContextConfiguration
 public @interface MyTestConfig{
    @AliasFor(annotation=ContextConfiguration.class,attribute="value")
	String[]xmlFiles();
 }

5.详情请看Spring注解编程

  • 对注解的发现算法有了显著提高.例如,本地的自定义注解更倾向于注解继承.

  • 从元注解修改属性的组合注解,如今能够在接口,抽象类,桥接方法,接口方法,还包括在类,标准方法,构造器,字段里被发现和扫描;

  • 表明注解属性(还有注解属性实例的)的集合能够被合成一个注解.

  • 基于字段的数据绑定(DirectFieldAccessor)的功能获得了和基于属性数据绑定的BeanWrapper同样的支持.特别是,字段绑定如今支持对集合,数组和Map的导航

  • DefaultConversionService如今为Strem(流),Charset(字符集),Currency(货币),TimeZone(时区)提供了开箱即用的转化器.这些转化器能够单独的添加到任意ConversionService中;

  • DefaultFormattingConversionService提供了对JSR-354 Money&Currency的值类型提供了开箱即用的支持(javax.money得在你的classpath中):货币单位和货币总值.它一样支持使用@NumberFormat 注解

  • @NumberFormat 能够被用为元注解

  • javaMailSenderImpl有一个新的testConnection()方法来检查服务器的链接性;

  • ScheduledTaskRegistrar 能够对外暴露Schedule 任务;

  • Apache commons-pool2如今支持一个共用AOP的CommonsPool2TargetSource资源;

  • 引入了StandarScriptFactory做为一个JSR-223为基础的脚本Bean机制,经过xml文件元素lang:std来暴露.支持包括 JavaScript和JRuby;(备注:因为JSR-223的使用,JRubyScriptFactory 和 lang:jruby标签如今已通过时了)

5.2 数据访问提高

  • javax.transaction.Transactional如今支持AspectJ
  • SimpleJdbcCallOperations如今支持命名绑定
  • 支持hibernate ORM5.0,经过他的原生API,它会做为一个JPA提供者;(新的org.springframework.orm.hibernate5转换)
  • 可用的数据库会自动分配一个惟一的名字;jdbc:embedded-database标签提供了一个新的database-name属性;更多细节查看'Testing Improvements'

5.3 JMS优化

  • 'autoStartup'属性能够经过JmsListenerContainerFactory来控制
  • 答复的类型即Destination能够经过一个listener container来配置
  • @SendTo注解的值能够是SpEL表达式
  • 回复的目的能够在运行时经过JmsResponse来计算
  • @JmsListener 如今已经做为一个可复用的注解,即在统一方法上申明几个JMS容器.若是你不是jdk1.8,那仍是用之前的@JmsListeners吧;

5.4 web 改善

  • http流和服务器发送事件支持(Sever-Sent Events support),查看 http流模块;

  • 对CORS内置支持,包括全局(MVC java配置和xml命名空间)和本地(@CrossOrigin)配置;细节查看27章 CORS支持

  • http 缓存更新

    1.新的CacheController组件,已插入到ResponseEntity,WebContentGenerator,ResourceHttpRequestHandler中.

    2.在WebRequest中改善了 ETag/Last-Modified支持

  • 自定义请求映射注解,能够把@RequestMapping做为元注解

  • 在AbstractHandlerMethodMapping中的公共方法能够在运行时用来注册和注销请求映射;

  • AbstractDispatcherServletInitializer类中的protected createDispatcherServlet方法能够用来自定义要使用的DispatcherServlet实例;

  • @ExceptionHandle类中方法的方法参数之一是HandlerMethod类;特别是用于@ControllerAdvice组件

  • java.util.concurrent.CompletableFuture能够做为控制器方法的返回类型

  • HttpHeader支持Byte-range(字节流) 请求用来提供静态资源;

  • @ResponseStatus 能够在内嵌的异常中检测

  • RestTemplate的UriTemplateHandler扩展点 1.DefaultUriTemplateHandler暴露了baseUrl属性,路径部分编码选项; 2.这个扩展点在任何URI template类库里都是可插拔的

  • OkHTTP 集成了 RestTemplate

  • 在MvcUriComponentsBuilder组件中自定义方法的 baseUrl选项;

  • Serialization/deserialization(序列化和反序列异常)如今都被记录为Warn级别;

  • 默认的JSON前缀已经从"{}&&"转为更安全的")]}',";

  • 新的 RequestBodyAdvice 扩展点及其扩展点支持在@ResponseBody 方法参数上使用 Jackson的@JsonView注解

  • 当使用GOSN或Jackson 2.6+时,处理方法返回类型已支持序列化的参数类型如List<Foo>;

  • 为脚本web视图引入以JSR-223为基础机制的ScriptTemplateView,这是Nashon(JDK8)上js视图模板的一个焦点

WebSocket Messageing 改善

  • 暴露关于用户和订阅的存在信息 1.新的SimpUserRegistry暴露了一个bean叫"UserRegistry"; 2.经过服务集群(查看代理终端配置选项)共享显示信息;
  • 经过服务集群释放用户目的地 (查看代理终端配置选项)
  • StompSubProtocolErrorHandler扩展点能够定制并控制客户端的STOMP ERROR架构
  • 在@ControllerAdvicce组件里定义全局的@MessageExceptionHandler方法
  • 用SimpleBrokerMessageHandler来处理订阅的心跳和SpEL表达式 'selector'请求头
  • STOMP客户端经过TCP和WebSocket协议来使用;详情见 STOMP 客户端
  • @SendTo和@SendTOUser能够包含目的地值提示
  • Jackson 的@JsonView 注解可使用在@MessageMapping和@SubscriptMapping方法的返回值上.
  • ListenableFuture和CompletableFuture能够是@MessageMapping和@SubscriptMapping方法的返回值类型
  • MarshallingMessageConverter对于xml的有效载荷

5.6 Testing改进

  • 单元集成测试如今能够经过使用Junit规则来替代SpringJunit4ClassRunner.他容许基于spring的集成测试.这容许spring集成测试经过其余的选择来启动项Junit的参数化或者第三方启动器,例如MockitoJunitRunner.
  • spring mvc test框架如今听了对HTMLUnit提供了一流的支持,包括对Selenium webDriver的集成,容许你对基于页面的web应用进行测试而不须要一个servlet容器;
  • AopTestUtils 是一个新的测试功能,它容许开发者使用一个引用--目标类下隐藏着一个或多个spring代理.
  • ReflectionTestUtils如今支持静态字段的设置和获取,包括常量
  • 经过@ActiveProfiles定义的Bean定义简介的排列顺序如今已重构,目的是支持一些使用场景,如使用spring Boot的ConfigFileApplicationListener,它强经过active profile的名字来加载配置文件
  • @DirtiesContext支持新的BEFORE_METHOD,BEFORE_CLASS,还有BEFORE_EACH_TEST_METHOD模式来在测试以前关闭ApplicationCotext.例如,一些有很大测试套件的流氓(已经肯定的)测试会损坏ApplicationContext的原始配置;
  • @Commit 注解能够做为@Rollback(false)注解的替代品;
  • @Rollback如今也能够用于配置class级别的默认回滚语义.所以,2TransactionConfiguration如今已通过时了,下个版本就会去掉
  • @Sql如今经过新的属性--statements支持行内sql状态
  • 用于存储不一样测试单元之间上下文的ContextCache已有一个默认实现的API,能够替代自钉子缓存需求
  • DefaultTestContext,DefaultBootstrapContext,DedaultCacaheAwareContextLoadeerDelegate如今是support包下的公共的class,容许被自定义扩展;
  • TestContextBootstrapper如今负责构建TestContext上下文
  • 在spring mvc Test 框架下,mvcResult细节能够被记录为DEBUG级别,或者写到一个自定义的输出流或Writer里.细节请到MockMvcResultHandlers查看新的log(),print(OutputStream),以及print(Writer)方法
  • JDBC xml命名空间如今在jdbc:embedded-database支持新的database-name属性,容许开发者为每一个可用的databases设置一个独一无二的名字.例如,经过一个SpEL 表达式或者属性提醒器(它能够被当前bean启动简介影响)
  • MockHttpServletRequest 和MockHttpServletResponse 如今能够经过getDateHeader和setDateHeader方法支持对日期头更好的格式化

spring4.3的新功能和新特性

6.1 核心容器的提高(Core Container Improvements)

  • 核心容器异常提供更肺腑的元数据支持已达到程序化评估
  • java8默认的方法支持检测bean属性的get和set方法
  • 当bean只有一个构造器时,此时没有必要指定@Autowired注解
  • @Configuration 类支持构造器注入;
  • SpEL表达式曾用于指定@EventListener的条件,如今能够用来指定beans(例如@beanName.method())
  • 组合注解如今能够用数组组件类型的单个元素来 重写元注解中的数组属性;好比,@RequestMapping中的属性 String[] path 能够在一个组合注解中重写为String path属性
  • @Scheduled 和 @Schedules 能够被用做元注解,于是也能够被自定义注解重写属性
  • @Scheduled 能够更好的支持各类做用域的beans;

6.2 数据访问提高

  • jdbc:initialize-database和jdbc:embedded-database支持一个可配置的分割器来使用各自的脚本.

6.3缓存优化

  • spring 4.3如今容许一个特定key的同时调用进行同步,因此这些值只能计算一次;这是一个选择的功能能够经过@Cacheable注解新的sync属性来实现.因为添加了一个get(Object key,Callable<T> valueLoader)方法,该功能为Cache接口带来一个突破性的变革.
  • 在caches相关的注解如今可使用SpEL 表达式来指定beans(例如 @BeanName.method())
  • ConcurrentMapCacheManager和ConcurrentMapCache如今经过新的 属性--storeByValue支持缓存键值对的序列化
  • @Cacheable,@cacheEvict,@cachePut,@Caching能够被当作元注解使用

6.4 JMS 优化

  • @SendTo 如今能够被指定为类级别的,能够共享一个通用的回复地址
  • @JmsListener和@JmsListeners能够做为元注解

6.5 web提高

  • 对HTTP head和http OPtions内置支持
  • 新的@GetMapping,@PostMapping,@PUtMapping,@DeleteMapping,@PatchMapping,它们使@RequestMapping的组合注解;详情查看组合注解
  • 新的做用域web scope的 @RequestScope,@SessionScope,@ApplicationScope组合注解;三个注解详情
  • 新的 @RestControllerAdvice 注解混合了@ControllerAdvice和@ResponseBody的语法
  • @ResponseStatus 如今支持类级别,并能够被全部方法继承
  • 新的@SessionAttribute注解能够访问session的属性
  • 新的@RequestAttribute注解能够访问rquest的属性
  • @ModelAttribute 能够阻止数据绑定,经过binding=false属性
  • 在mvc异常处理器中,将Errors和自定义Throwables 统一暴露;
  • 在Http消息转化器(http message converters)中进行字符集处理,包括将urf-8做为混合文本内容的默认字符集
  • 静态资源处理器使用配置的ContentNegotiationManger对媒体资源类型进行判断
  • RestTemplate 和 AsynRestTemplate经过defaultUriTemplateHandler进行严格的URI便利编码
  • AsyncRestTemplate支持严格的请求拦截

6.6 WebSocket Messaging 优化

  • @SendTo 和SendToUser 能够做用于类级别

6.7 测试优化

  • Spring TestContext Framework 对Junit要求4.12或更高版本
  • SpringRunner是SpringJunit4ClassRunner的别名
  • Test相关注解能够被宣布在注解上,例如,对测试接口的使用能够利用java8中的接口默认方法 -若是当默认的XML文件,Groovy脚本,@Configuration class被发现时 @ContextCongfiguration空的申明如今能够忽略了,
  • @Transactional 测试方法再也不要求必须是public的了.好比TestNG或JUnit5
  • @BeforeTransaction 和@AfterTranscation 方法再也不要求必须是public的,也能够在java8接口的默认方法中使用
  • 在 spring TestCOntext Framework 缓存中的ApplicationContext,如今已被默认的最大值32和最近不多使用的放逐政策所限定.缓存的最大规模能够被一个JVM系统参数或者spring的属性spring.test.context.cache.maxSize来配置.
  • 新的ContextCustomizer API能够自定义一个测试的ApplicationContext,它在bean定义加载以后,在上下文刷新以前.自定义器能够被第三方jar包注册,摒弃了对其自定义ContextLoader的需求;
  • @Sql和@SqlGroup能够做为元注解
  • ReflectionTestUtils如今自动获取代理当你设置或者获取一个字段时
  • 服务端的spring mvc test支持在response header上混合值的预期
  • 服务端的spring mvc test能够转化form表单并操做请求参数
  • 服务端的spring mvc test在启动处理方法时支持模拟断言
  • 客户端的Rest 测试能够指明一个请求的测试次数及其哪些声明的预期将被忽略.
  • 客户端的Rest Test 对请求体中form data的预期

6.8 对新的libary和服务器版本的支持

  • hibernate ORM5.2 (4.2,4.3,5,0,5.2,其余都过期了)
  • Jackson 2.8 (2.6+)
  • OkHttp 3.x(同时支持2.X)
  • Netty 4.1
  • Undertow 1.4
  • Tomcat 8.5.2 ,9.0M6
  • 在spring-core.jar中更新 ASM5.1和Objenesis 2.4
相关文章
相关标签/搜索