##3.spring 4.0的新功能和改善 spring框架在2014年收发;到目前为止有这几个主要版本:spring2.0提供了xml命名空间和AspectJ的支持;spring2.5实现了注解驱动配置;spring3.0在代码里引入了强大的java5.0+(1.5,1.6,1.7)的基础;还提供了基于java的@Configuration模式; 4.0版本是spring最新的主要发布版,首次完全支持java8的特性;你还是可以用旧版本来支持spring的,但要在jdk1.6以上;我们还提供了可以删除许多过时类和方法的主要发布版本选项; ###3.1 让获取起步经验更容易 新的 spring 网站提供了一系列的"getting Started"手册帮助你学习spring;你可以从第一章启动spring部分获得更多资料.新网站还对这些在spring框架下的新项目提供了复杂的文档介绍; 如果你是maven用户,那么你可能对bill of materials部分感兴趣,每个发布版都会有;
3.2 去掉过时的包和方法(Removed deprecated Packages and methods)
许多过时的包,类,方法已经从4.0版本里删掉了. 如果你要更新你的spring版本,你要保证你能修复所有由我们定义的过时APIS引起的过时调用问题; 你可以从 API Differences Report得到详细的变更列表 请注意,所有的第三方依赖都必须是2010/2011年以上版本(spring4.0只支持2010版本或更新版本); 尤其,hibernate3.6+,Ehcache 2.1+,Quartz 1.8+,Groovy 1.8+,Joda-Time 2.0+.这里有个例外,spring 4.0要求bibernate验证器要为4.3版本,现在对Jackson的支持要求为2.0+版本;(spring3.2支持1.8/1.9版本,然现在已过时) ###3.3 java8(也有 6和7) spring 4.0 提供了对java8功能的一些支持.你可以再spring回调接口中使用lambda表达式和方法表达式.这里对java.time包((JSR-310)[http://jcp.org/en/jsr/detail?id=310]) 有一流的支持,还把几种已存在的注解改装为@Repeatable注解一样.你还可以使用java8的参数名字发现机制(基于参数编译器标志)作为替代项使你在编译期间获取调试信息; 保持对java6,7的兼容,但jdk6要求是 JDK 6 update 18;然还是建议要8; ###3.4 java EE 6和7 java EE 6是spring框架的最低版,主要是JPA2.0和Servlet3.0规格和它部分关联.为了保持与Google App Engine和旧版本应用容器的兼容性,你可以在Servlet2.5的版本上运行spring4.0的项目.然Servlet 3.0+仍被强烈推荐,他是spring test模块和模仿测试包在开发环境中的先决条件; suggest:如果你使用WebSphere 7,那么你必须安装JPA2.0的功能包.在weblogic 10.3.4或者更高的版本上,JPA2.0已经安装了.所以这两中版本的服务容器都兼容spring4.0的部署环境. 再往前看,spring 4.0支持java EE7的的应用规则:特别是JMS2.0,JTA1.2,Bean Validation 1.1,JSR-236 Concurrency Utilities.通常,它支持各种规范的具体应用.然而,部署在Java EE 7 的服务器上也能运行良好; 只有SPring4.0++才支持hibernate 4.3+和JPA2.0+.这同样适用于Hiberante Validator 5.0 ,Bean Validation 1.1.(这两者没有被Spring 3.2正式支持) ##Groovy Bean Definition DSL(Groovy Bean的定义语句 DSL) 可以使用Goovy DSL来定义spring4.0的配置文件.她可以使用比xml更简洁的语法.它可以使你启动代码变得更容易.例如:
def reader=new GroovyBeanDefinitionReader(myApplicationContext)
reader.beans{
dataSource(BasicDataSource){
driverClassName="org.hsqldb.jdbcDriver"
url="jdbc:hsqldb:mem:grailsDB"
username="sd"
password=""
settting=[mynew:"setting"]
}
sessionFactory(SessionFactory){
dataSource=dataSource
}
myService(MyService){
nestedBean={AnotherBean bean->
dataSource=dataSource
}
}
}
3.6 核心容器改善
有以下改善:
- 将泛型类型视为注入机制的限制条件.例如你使用Repository,那么你可以很容易注入一个具体实现 @Autowired Repository<Customer> customerRepository;
- 如果你使用spring的元注解支持,你可以开发自动以注解,从资源注解中暴露特定属性;
- @Order 加载顺序,值越小越先加载
- @Lazy 可作用在Bean的注解上;
- @Description 注解用于基于java配置
- @Conditional 条件注解()简单示例:@Conditional(Conditioner.class);
public class Conditoner implement condition{
@Override
public boolean matches(ConditionContext context,AnnotatedTypeMedtadata metadata){
return ....
;
}
}
简单使用, 和profile注解效果相似
- CGLIB-based 的代理类不需要一个默认的构造器. objenesis 类库提供的支持,而它集成到spring中.你的代理类就不需构造器了
- 提供时区管理的功能;通过LocaleContext类
###3.7 web优化 要使用Servlet3.0的包,2.5虽然也可以.但如果你要使用Spring Mvc Test 框架,就必须用Servlet3.0; 除了下文会提到的WebSocket支持外,还有以下改进 - 你可以在springmvc项目使用@RestController注解,它可以去掉你每个@RequestMapping方法的返回时的@ResponseBody注解;
- 已添加AsyncRestTemplate 类,提供非阻塞的异步支持
- 提供完善的时区支持 ###3.8 webSocket,SockJS,and STOMP Messaging spring-websocket模块对基于WebSocket的应用提供全面支持;WebSocket可以使客户端和服务器之间进行通信.它兼容JSR-356,Java webSocket API,还对目前不支持WebScoket协议的浏览器提供了其他基于SockJS的失败支持(换成长连接或短连接),如IE10以下版本不支持webSocket协议; 一个新的spring消息模块添加了对STOMP的支持,它使用注解编程模式,用于从WebSocket客户端接收和处理STOMP的消息.通过它,@Controller的类可以同时在一个方法上添加@RequestMapping和@MessageMapping方法,用来处理http请求和基于webSocket连接客户端的消息; 这个新的Spring-messageing 模块也包括了原来的spring Integer项目的关键抽象;例如Message,MessageChannel,MessageHandler,还有其他作为消息应用的基础服务的组件; 对于更多的细节,包括更详细的介绍,请参考Chapter 26, WebSocket Support 这章; ###3.9 测试优化 除了去掉过时的代码,spring4.0还提供了单元测试和基础测试的一些新方法
- 原来的spring-test模块的大部分注解(例如 @ContextConfiguration,@WebAppConfiguration,@ContextHierarchy,@ActiveProfilles)可以作为元注解来生成自定义注解,并减少测试环境的重复配置;
- 启动Bean定义的Profiles可以通过编程释放,可以一个自定义实现的ActiveProfilesResolver类,并把它通过@ActiveProfiles的resolver属性进行注册;
- spring core中提供了一个新的SocketUtils类,它可以扫描TCP和UDP服务器在本地的空闲端口;该功能并不是针对测试的,但是在聚合测试使用socket时会很有用.例如,测试时启动了一个启动内存的SMTP服务器,FTP服务器,Servlet服务器等.
- spring4.0,在org,springframework.mock.web包的模拟部分已经基于Servlet3.0的API了.还有,Servlet API的模拟模块一部分更新为少量加强和优化;