spring4.X 的更新大全

亡梦爱人 提交于 2019-11-30 18:27:11

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 抽象,让你继续享受其便利;

  • 消息监听器端点可以有一个更灵活的签名,并从消息注解中获益,如@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”;

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

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

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

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

  • JSONP现在支持Jackson;查看 the section called “Jackson JSONP Support”.

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

  • 这里有三个新的HttpMessageConverter选项

  • 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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!