`
jinnianshilongnian
  • 浏览: 21424250 次
  • 性别: Icon_minigender_1
博客专栏
5c8dac6a-21dc-3466-8abb-057664ab39c7
跟我学spring3
浏览量:2403122
D659df3e-4ad7-3b12-8b9a-1e94abd75ac3
Spring杂谈
浏览量:2996146
43989fe4-8b6b-3109-aaec-379d27dd4090
跟开涛学SpringMVC...
浏览量:5630387
1df97887-a9e1-3328-b6da-091f51f886a1
Servlet3.1规范翻...
浏览量:257181
4f347843-a078-36c1-977f-797c7fc123fc
springmvc杂谈
浏览量:1592644
22722232-95c1-34f2-b8e1-d059493d3d98
hibernate杂谈
浏览量:248792
45b32b6f-7468-3077-be40-00a5853c9a48
跟我学Shiro
浏览量:5845630
Group-logo
跟我学Nginx+Lua开...
浏览量:697465
5041f67a-12b2-30ba-814d-b55f466529d5
亿级流量网站架构核心技术
浏览量:779839
社区版块
存档分类
最新评论

Spring4.1新特性——综述

阅读更多

目录

Spring4.1新特性——综述

Spring4.1新特性——Spring核心部分及其他

Spring4.1新特性——Spring缓存框架增强

Spring4.1新特性——异步调用和事件机制的异常处理

Spring4.1新特性——数据库集成测试脚本初始化

Spring4.1新特性——Spring MVC增强

Spring4.1新特性——页面自动化测试框架Spring MVC Test HtmlUnit简介

Spring4.1新特性——静态资源处理增强

 

Spring 4.1目前已经发布RC1版本,而GA版本预计在14年9月中旬发布;其中有部分内容直接借鉴自Spring Boot,而Spring Boot从目前趋势来看已经是Spring的顶级项目;另外也提供了页面自动化测试框架Spring MVC Test HtmlUnit,和Spring MVC Test一样先是独立项目,如果发展态势很好,会最终合并到Spring Framework中。

 

从目前来看Spring 4.1并没有特别吸引眼球的地方,主要还是增强和一些依赖的版本升级。主要改进如下:

1、核心部分基本上无变化,提供了DirectFieldAccessor用于直接字段访问、yaml配置、SpEL的字节码编译化、BackOff退避算法的基本实现、Base64Utils、SmartInitializingSingleton等;

2、在任务调度和事件机制上加入了异常处理部分;

3、cache部分加入jcache的集成、类级别的@CacheConfig的支持、CacheResolver;

4、mvc部分提供了一些视图解析器的mvc标签实现简化配置、提供了GroovyWebApplicationContext用于Groovy web集成、提供了Gson、protobuf的HttpMessageConverter、静态资源处理方面添加了resolver和transformer、提供了对groovy-templates模板的支持、JSONP的支持、对Jackson的@JsonView的支持等;

5、提供了页面自动化测试框架Spring MVC Test HtmlUnit;

6、test部分提供了更便利的@sql标签来执行测试脚本的初始化、MockRestServiceServer对AyncRestTemplate支持、MockMvcConfigurer来全局配置MockMvc;

7、提供了对Java 8 Optional的支持(ObjectToOptionalConverter实现;可以在MVC中如@RequestParam等注解的绑定)、从Spring 4.1起Ehcache支持需要EhCache 2.5或更高版本、兼容Quartz 2.1.4、支持javax.annotation.Priority(等价于@Order)、JMS API的增强、SpringJUnit4ClassRunner需要 JUnit 4.9或更高版本支持。

 

从目前发展来看Spring把重点放在了Spring Boot上,另一方面Spring体系太庞大,要寻找和添加依赖,及选择版本特别麻烦,而且容易产生版本冲突等,因此又诞生了Spring IO Platform,如果用过maven的话,相当于给你很多默认依赖,然后需要的时候直接添加即可,无需指定版本。

 

从如上可以看出,吸引人的新特性很少,另外目前还不稳定,API异变,功能有BUG,如果没有把控能力,不建议把新特性用于新项目,后续部分我会按照如下几部分讲解Spring4.1新特性:

Spring核心部分及其他

Spring缓存框架增强

异步调用和事件机制的异常处理

数据库集成测试脚本初始化

Spring MVC增强

页面自动化测试框架Spring MVC Test HtmlUnit简介

静态资源处理增强

 

目前给我的印象是Spring Framework已经非常庞大,基本使用还是比较简单,而且如果深入下去基本上我们需要的功能都可以进行扩展,这也是最佩服它的一点,目前给我最不好的就是Java Config和XML Config都支持,会给人一种混乱的感觉;其实最好把这种配置也单独提取到一个项目中。因为我在测试Spring 4.1时遇到过在Java Config下好用,而XML Config下实现错误。从目前发展态势来看,1、推广它们的Groovy;2、微服务;3、周边的各种生态集成;4、目前最需要解决的就是简化使用;功能太多造成学习成本也高了,会吓跑一些人。用好了Spring生态系统,工作起来真的是很得心应手。

 

依赖:

使用4.1.0.BUILD-SNAPSHOT,请使用Spring官方maven仓库下载依赖。

   <repositories>
        <repository>
            <id>spring-milestone</id>
            <url>https://repo.spring.io/libs-milestone</url>
        </repository>
        <repository>
            <snapshots><enabled>true</enabled></snapshots>
            <id>repository.spring.snapshot</id>
            <name>Spring Snapshot Repository</name>
            <url>http://repo.spring.io/snapshot</url>
        </repository>
    </repositories>

 

示例项目:

https://github.com/zhangkaitao/spring4.1-showcase  

 

Spring4新特性

Spring4新特性——泛型限定式依赖注入

Spring4新特性——核心容器的其他改进

Spring4新特性——Web开发的增强

Spring4新特性——集成Bean Validation 1.1(JSR-349)到SpringMVC 

Spring4新特性——Groovy Bean定义DSL

Spring4新特性——更好的Java泛型操作API 

Spring4新特性——JSR310日期API的支持

Spring4新特性——注解、脚本、任务、MVC等其他特性改进 

 

参考资料

https://spring.io/blog/2014/01/14/the-spring-framework-4-1-plan-and-4-0-1-3-2-7-releases-coming-up-next-week

http://spring.io/blog/2014/06/16/further-cache-improvements-in-spring-4-1

https://spring.io/blog/2014/04/30/spring-4-1-s-upcoming-jms-improvements

http://spring.io/blog/2014/05/28/using-the-innovative-groovy-template-engine-in-spring-boot

http://spring.io/blog/2014/08/06/spring-mvc-test-htmlunit-1-0-0-m2-released

http://spring.io/blog/2014/07/28/spring-framework-4-1-spring-mvc-improvements

http://spring.io/blog/2014/07/24/spring-framework-4-1-handling-static-web-resources

http://www.slideshare.net/sbrannen/spring-framework-40-to-41(需 翻 墙)

18
4
分享到:
评论
23 楼 java_web_hack1 2016-11-01  
http://edu.51cto.com/course/course_id-6558.html
spring boot实战视频教程
22 楼 微积天 2015-03-25  
算了,我用注解。
在网上只找到你一个人使用xml配置SpringMVC的例子,别人都用注解。
找到的书籍,比如《Spring 3.x企业应用开发实战》、《Spring in Action》,也都是用注解配的。
21 楼 微积天 2015-03-25  
楼主,你那个《跟着开涛学SpringMVC》的教程,其中一个MultiActionController的示例,我到现在都没学会。
你那个示例里面,url请求、方法名、jsp名,所有的名字和结构都是一样的,user/create、user/list等等,你那个xml里面的配置,我根本分不清楚哪一段是解析方法,哪一段是解析视图,自己写的xml总是写不对:
org.springframework.beans.factory.BeanCreationException: Error creating bean with name '/userCtrl/**' defined in ServletContext resource [/WEB-INF/SpringMVC-servlet.xml]: Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyException: Invalid property 'userCtrl' of bean class [org.springframework.web.servlet.mvc.multiaction.MultiActionController]: Bean property 'userCtrl' is not writable or has an invalid setter method. Does the parameter type of the setter match the return type of the getter?


我的xml:
	<bean id="userCtrl" class="control.UserCtrl">
		<property name="registerView" value="successPage"></property>
	</bean>
	
	<bean name="/userCtrl/**" class="org.springframework.web.servlet.mvc.multiaction.MultiActionController">
		<property name="userCtrl" ref="userCtrl"/>
		<property name="methodNameResolver" ref="parameterMethodNameResolver"/>
	</bean>
	
	<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
	
	<bean id="parameterMethodNameResolver" 
			class="org.springframework.web.servlet.mvc.multiaction.ParameterMethodNameResolver">
		<property name="methodParamNames" value="register,login"/>
	</bean>
	
	<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
		<property name="prefix" value="/jsp"/>
		<property name="suffix" value=".jsp"/>
	</bean>
	
	<bean id="propertiesMethodNameResolver" 
			class="org.springframework.web.servlet.mvc.multiaction.PropertiesMethodNameResolver">
		<property name="mappings">
			<props>
				<prop key="/registerAccount">register</prop>
			</props>
		</property>
	</bean>
20 楼 pelify 2014-10-14  
spring4.1删除了两个jar包:1 spring-build-src-4.0.6.RELEASE.jar    2  spring-framework-bom-4.0.6.RELEASE.jar  运行时有时会导致这个样的问题




2014-10-14 11:09:10 org.apache.catalina.core.StandardWrapperValve invoke
严重: Servlet.service() for servlet springMvc threw exception
java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I
at org.springframework.web.servlet.FrameworkServlet.publishRequestHandledEvent(FrameworkServlet.java:1066)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:996)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:98)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:857)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:588)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Unknown Source)
19 楼 pelify 2014-10-14  
spring4.1删除了两个jar包:1 spring-build-src-4.0.6.RELEASE.jar    2  spring-framework-bom-4.0.6.RELEASE.jar  运行时有时会导致这个样的问题

2014-10-14 10:17:52 [http-8080-Processor25] DEBUG org.springframework.web.servlet.DispatcherServlet - Successfully completed request
2014-10-14 10:17:52 [http-8080-Processor25] ERROR org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/TEST].[springMvc] - Servlet.service() for servlet springMvc threw exception
java.lang.NoSuchMethodError: javax.servlet.http.HttpServletResponse.getStatus()I
at org.springframework.web.servlet.FrameworkServlet.publishRequestHandledEvent(FrameworkServlet.java:1066)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:996)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:707)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:820)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)
at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)
at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)
at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)
at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)
at java.lang.Thread.run(Thread.java:619)
这种情况怎么解决?谢谢
18 楼 gang.chen 2014-08-26  
还没试过Spring官方maven仓库,如果不需要指定版本,默认依赖的是什么版本?
17 楼 gang.chen 2014-08-26  
向tao哥学习,以后常来  PS:汉字taoge竟然是敏感关键字~
16 楼 lahui 2014-08-22  
刚开始学SpringMVC,只能说楼主太赞了!
15 楼 jinnianshilongnian 2014-08-12  
Chen.H 写道
github项目checkout 报错

报什么错
14 楼 Chen.H 2014-08-12  
github项目checkout 报错
13 楼 jinnianshilongnian 2014-08-12  
2008dreams 写道
开涛V5  看过你写的shiro  超赞。。。 

谢谢
12 楼 jinnianshilongnian 2014-08-12  
Dead_knight 写道
骨之灵魂 写道
顶开涛
继续努力 奶茶妹妹就是你的

难道你们没发现么,博主前几期都是《跟叶子学把妹》,看来博主在下一盘很大的棋啊

真没有 哈哈
11 楼 2008dreams 2014-08-12  
开涛V5  看过你写的shiro  超赞。。。 
10 楼 Dead_knight 2014-08-12  
骨之灵魂 写道
顶开涛
继续努力 奶茶妹妹就是你的

难道你们没发现么,博主前几期都是《跟叶子学把妹》,看来博主在下一盘很大的棋啊
9 楼 jinnianshilongnian 2014-08-12  
Dead_knight 写道
tianice 写道
spring本来是取代ejb的,现在搞的自己也越来越复杂了。

现在javaee体系也很好用。ejb、cdi……

cdi 1.1很强大
8 楼 jinnianshilongnian 2014-08-12  
骨之灵魂 写道
顶开涛
继续努力 奶茶妹妹就是你的

7 楼 骨之灵魂 2014-08-12  
顶开涛
继续努力 奶茶妹妹就是你的
6 楼 Dead_knight 2014-08-11  
tianice 写道
spring本来是取代ejb的,现在搞的自己也越来越复杂了。

现在javaee体系也很好用。ejb、cdi……
5 楼 jinnianshilongnian 2014-08-11  
Dead_knight 写道
哥们,你这是有多强,spring被你吃透了都~

额 真没有
4 楼 Dead_knight 2014-08-11  
哥们,你这是有多强,spring被你吃透了都~

相关推荐

Global site tag (gtag.js) - Google Analytics