1. spring 2.0 和 2.5 的新特性
1.1 简介
JDK 版本要在 1.4.2 以上,Java 5 和 Java 6 都支持。
Spring 框架继续保持对 Java EE 1.3 及以后版本的兼容,完全支持 Java EE 5。
对服务器(应用服务器和Web服务器)的支持:
- WebLogic:8.1、9.0、9.2、10
- WebSphere:5.1、6.0、6.1
- OC4J(Oracle):10.1.3、11
- JBoss:3.2、4.0、4.2
- Tomcat:4.1、5.0、5.5、6.0
- Jetty:4.2、5.1、6.1
- Resin:2.1、3.0、3.1
- GlassFish:v1、v2
1.2 控制反转(IOC)容器
1.2.1 新的 bean 作用域
Spring2.0:IoC 容器中只支持 singleton 和 prototype 两个不同的 bean 作用域。
Spring2.5:还支持 request、session、global session 三个在 web 环境下使用的 bean 作用域,且提供了hooks,可以让用户创建自己的作用域。
1.2.2 更简单的 XML 配置
Spring2.5 对 Spring2.0 的 DTD 进行了更新,spring-beans-2.0.dtd 可在发布包下的 dist/resources 下找到。
1.2.3 可扩展的 XML 编写
作为一个应用程序开发人员或第三方框架或产品的供应商,开发自定义标签,供其他开发人员把这些标签嵌入到自己的Spring配置文件里。
1.2.4 Annotation(注解)驱动配置
Spring 2.0 引入了一些用于配置的 annotation, 包括 @Transactional, @Required, @PersistenceContext /@PersistenceUnit
。
Spring 2.5 引入了用于配置的完整的 Annotation 集合: @Autowired
,以及对 JSR-250 注解 @Resource, @PostConstruct, @PreDestroy
的支持。
1.2.5 在 classpath 中自动搜索组件
组件类会注解为 stereotype: @Component, @Repository, @Service, @Controller
,取决于程序的上下文配置,这些组件会被自动搜索到,并且转变为 Spring bean 定义,而不需要为每个类都进行明确的配置。
1.3 面向切面编程(AOP)
1.3.1 更加简单的 AOP XML 配置
1.3.2 对 @AspectJ 切面的支持
1.3.3 对 bean 命名 pointcut 的支持
1.3.4 对 AspectJ 装载时织入的支持
1.4 中间层
1.4.1 在XML里更为简单的声明性事务配置
Spring 2.5 支持方便的注解驱动的事务管理,通过 context:load-time-weaver 和 tx:annotation-driven mode=”aspectj” 的联合使用进行事务管理。
1.4.2 对 Websphere 事务管理的完整支持
要自动探测底层的 JTA 事务平台,可以使用 Spring 2.5 的新 tx:jta-transaction-manager 配置元素。它会自动探测 BEA WebLogic 和 IBM WebSphere,注册正确的 PlatformTransactionManager。
1.4.3 JPA
Spring 2.5 对 OpenJPA 的支持升级到了 OpenJPA 1.0,支持 savepoint 这样的高级特性。
1.4.4 异步的JMS
在 Spring 2.0 之前,Spring 的 JMS 的作用局限于发送消息和同步接收消息。
Spring 2.0 提供对异步消息接收的完整支持。
在 Spring 2.5 中, JCA 风格的异步消息监听器设置也通过 GenericMessageEndpointManager 工具得到了支持。
1.4.5 JDBC
引入了新类,Spring 2.5 扩充了 SimpleJdbcTemplate 的功能,引入了 SimpleJdbcCall
和 SimpleJdbcInsert 操作对象。
1.5 Web 层
1.5.1 Spring MVC 合理的默认值
1.5.2 Portlet 框架
1.5.3 基于 Annotation 的控制器
1.5.4 Spring MVC 的表单标签库
1.5.5 对 Tiles 2,JSF 1.2,JAX-WS 支持
2. spring 3.x 的新特性
2.1 spring 3.0
2.1.1 Spring3.0 以后分成多个 jar 包
org.springframework.aop
, 包含在应用中使用Spring的AOP特性时所需的类。org.springframework.asm
,Spring独立的asm程序,Spring2.5.6的时候需要 asm.jar 包,3.0开始提供自己独立的asm.jarorg.springframework.aspects
,提供对AspectJ的支持,以方便的将面向切面的功能集成进IDE中,比如Eclipse AJDT.org.springframework.beans
,所有应用都要用到,它包含访问配置文件,创建和管理Bean以及进行反转共控制和依赖注入操作时所需的类org.springframework.context
,为 Spring 核心提供了大量扩展。可以找到使用Spring ApplicationContext 特性时所需的全部类,JDNI所需的全部类,UI方面的用来与模板(Templating)引擎如 Velocity、 FreeMarker、 JasperReports 集成的类, 以及校验 Validation 方面的相关类。org.springframework.context.support
,包含支持缓存Cache(ehcache)JCA、JMX、邮件服务(Java Mail、Mail)COS、任务计划Scheduling(Timer、Quartz)方面的类。org.springframework.core
,包含 Spring 框架基本的核心工具类,Spring 其它组件要都要使用到这个包里的 类,是其它组件的基本核心。org.springframework.expression
,包含Spring 表达式语言相关的类,应用使用到SpEL时需要添加这个jar包。org.springframework.instrument.tomcat
,Spring3.0对Tomcat的连接池的集成。org.springframework.instrument
,Spring3.0 对服务器的代理接口。org.springframework.jdbc
,包含对 Spring 对 JDBC 数据访问进行封装的所有类。org.springframework.jms
,提供了对JMS1.0.2/1.1 的支持类。org.springframework.orm
,包含Spring对DAO特性集进行了扩展,使其支持iBATIS、JDO、OJB、TopLink,因+ 为Hibernate已经独立成包了,现在不包含在这个包里了。这个jar文件里大部分的类都要依赖spring-dao.jar里的类,用这个包时你需要同时包含 spring-dao.jar包。org.springframework.oxm
,Spring 对 Object/XMl 的映射支持,可以让Java与XML之间来回切换。org.springframework.test
,对Junit等测试框架的简单封装。org.springframework.transaction
,为JDBC、Hibernate、JDO、JPA等提供的一致的声明式和编程式事务管理。org.springframework.web
,包含Web应用开发时,用到Spring框架时所需的核心类,包括自动载入WebApplicationContext特性的类、Struts与JSF集成类、文件上传的支持类、Filter类和大量工具辅助类。org.springframework.web.portlet
,对SpringMVC的增强,包含SpringMVC相关的类org.springframework.web.servlet
,对J2EE6.0的Servlet3.0的支持。org.springframework.web.struts
,对Struts框架支持,可以更方便更容易的集成Struts框架。
2.1.2 新增特性
- Spring 表达式语言
- 增强的 IOC 和基于 java 的 Bean 元数据
- 通用类型转换系统和字段格式
- 来自于 Srping Web Services 项目的对象和 XML 之间的映射
- 增强的 REST 支持
- @MVC additions (Spring的 MVC 注解增强)
- 声明式模型验证
- 提前对 JEE6 的支持
- 嵌入式数据库的支持
2.1.3 基于 Java 5 的核心API的更新
- BeanFactory接口尽可能的返回明确的实例:
- T getBean(Class
requiredType) - getBean(String name, Class
requiredType) - Map
getBeansOfType(Class type)
- T getBean(Class
- Spring 的 TaskExecutor 继承 java.util.concurrent.Executor 接口
- 扩展的子接口 AsyncTaskExecutor 支持标准的具有返回结果 Futures 的 Callables
- 基于 Java5 的 API 和 SPI 转换器
- 无状态的 ConversionService 和 Converters
- 取代标准的 JDK PropertyEditors
- 类型化的 ApplicationListener
2.1.4 Spring 表达式语言(简称SpEL)
SpEL 使得 java 具有动态语言的风格,可以在运行时获取表达式的值。依赖注入时可以使用 SpEL 表达式语言, 不再只是原来简单的属性文件变量(xml)。
示例:
xml 配置:
123456<bean class="mycompany.RewardsTestDatabase"><property name="databaseName"value="#{systemProperties.databaseName}"/><property name="keyGenerator"value="#{strategyBean.databaseKeyGenerator}"/></bean>java 代码:
12345678public class RewardsTestDatabase {"#{systemProperties.databaseName}")(public void setDatabaseName(String dbName) { ... }"#{strategyBean.databaseKeyGenerator}")(public void setKeyGenerator(KeyGenerator kg) { ... }}
2.1.5 增强的 IOC 和基于 java 的 bean 配置
更多的注解的支持:@Configuration,@Bean,@DependsOn, @Primary,@Lazy,@Import,@ImportResource,@Value
示例:
xml 配置:
123<context:component-scan base-package="org.example.config"/><util:properties id="jdbcProperties"location="classpath:org/example/config/jdbc.properties"/>也可以使用如下代码来代替 xml 的配置:
12ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);FooService fooService = ctx.getBean(FooService.class);java 代码:
12345678910111213141516171819202122232425262728package org.example.config;...public class AppConfig {private ("#{jdbcProperties.url}") String jdbcUrl;private ("#{jdbcProperties.username}") String username;private ("#{jdbcProperties.password}") String password;public FooService fooService() {return new FooServiceImpl(fooRepository());}public FooRepository fooRepository() {return new HibernateFooRepository(sessionFactory());}public SessionFactory sessionFactory() {// wire up a session factoryAnnotationSessionFactoryBean asFactoryBean = new AnnotationSessionFactoryBean();asFactoryBean.setDataSource(dataSource());// additional configreturn asFactoryBean.getObject();}public DataSource dataSource() {return new DriverManagerDataSource(jdbcUrl, username, password);}}
2.1.6 通用类型转换系统和字段格式化系统
Spring3.0 加入了一个通用的类型转换系统,它被 SpEL 用作类型转换,并且可能被一个 Spring 容器使用,用于当绑定 bean 的属性值时进行类型转换。此外还增加了一个字段格式化系统,它提供了更简单且强大的功能以替代在客户端环境下的 Javabean 的 PropertyEidtors。
2.1.7 声明式模型验证
支持 JSR303,使用 Hibernate Validator 作为默认实现:
2.2 spring 3.1
2.2.1 新增特性
- Cache 抽象
- Bean 定义配置文件
- Environment 抽象
- PropertySource 抽象
- 注解代替 xml 配置
- 对 Hibernate 4.x 的支持
- TestContext 框架对 @Configuration 和 Bean 定义配置文件 的支持
- 更为简洁的构造函数注入 c: namespace
- 非标准 setter 类的注入
- Servlet 3 code-based configuration of Servlet Container 的支持
- Servlet 3 MultipartResolver 的支持
- 改善了 O/R 映射支持,允许无persistence.xml的JPA包扫描
- 可以在 controller 中,使用 annotation 临时指定特殊的 Mapping 或者 ExceptionHandler,而且整个体系更加灵活和可扩展。
2.3 spring 3.2
2.3.1 新增特性
- 支持基于Servlet 3的异步请求处理
- Spring MVC Test框架
- 内容协商(Content Negotiation)改进。ContentNeogtiationStrategy 现在可以根据传入请求确定请求的媒体类型。可用的实现是基于文件扩展名、查询参数、“Accept”头或者一个固定的内容类型。
- @ControllerAdvice
- 矩阵变量(Matrix Variables),增加了 @MatrixVariable 用于从请求URI中提取矩阵变量。
- 增加了一个抽象基础类用于支持基于代码的Servlet 3+容器初始化。
- ResponseEntityExceptionHandler,用于处理异常消息的转换,和 DefaultHandlerExceptionResolver 的区别在于,这个类返回 ModelAndView。
- RestTemplate 和 @RequestBody 的参数支持泛型。
- 支持Jackson JSON 2
- 支持Tiles 3
- 改进 @RequestBody。@RequestBody 和 @RequestPart 的参数现在可以跟随Error参数,使它可以在 @RequestMapping 方法中处理验证的错误,@RequestBody 现在有一个 required 属性。
- HTTP PATCH 方法。HTTP PATCH方法现在可用于@RequestMapping
- 拦截器(Interceptor)支持 URL patterns
- 在注入点(Injection Point)和Bean方法定义中使用元注解
- 初步支持JCache 0.5
- @DateTimeFormat不再依赖Joda Time
- 全局日期时间格式化
- 新的测试特性
- 并发性的微调
- 基于Gradle的构建系统,并迁移到GitHub
- 支持Java SE 7和OpenJDK 7
3. spring 4.x 的新特性
3.1 spring 4.0
3.1.1 新增特性
- 删除了被丢弃的包和方法
- Java 8 的支持,最低需要 Java 6
- 使用 Java EE 6 或以上的版本来作为基线,同时包含了相关的 JPA2.0 和 Servlet3.0 的规范
- 使用 Groovy 的 DSL(DomainSpecific Languages)来定义 Bean
- 核心容器的改进
- Spring 注入 Bean 的时候把泛型类型当成一种形式的限定符。使用 Spring DataRepository 可以方便的插入特定的实现:@Autowired Repository
customerRepository。 - 使用 Spring 的元注解支持,可以开发自定义注解来公开源注解的特定属性。
- 当自动装配到 lists 和 arrays 时,Beans 可以被排序,支持 @Order 注解和 Ordered 接口两种方式。 @Lazy 注解可以用在注入点以及 @Bean 定义上。
- 引入 @Description 注解,开发人员可以使用基于Java 方式的配置。
- 根据条件筛选 Beans 的广义模型通过 @Conditional 注解加入。这和@Profile支持的类似,但是允许以编程式开发用户定义的策略。
- 基于 CGLIB 的代理类不在需要默认的构造方法。
- 框架支持管理时区。
- Spring 注入 Bean 的时候把泛型类型当成一种形式的限定符。使用 Spring DataRepository 可以方便的插入特定的实现:@Autowired Repository
- 常规 Web 改进
- 在 Spring MVC 应用中使用新的 @RestController 注解时,不再需要给 @RequestMapping 的方法添加 @ResponseBody 注解。
- AsyncRestTemplate 类已被添加进来,当开发 REST 客户端时,允许非阻塞异步支持。
- 当开发 Spring MVC 应用时,Spring 现在提供了全面的时区支持
- WebSocket, SockJS 和 STOMP 消息
- 测试改进,引入了几个用于单元测试和集成测试的新功能
- 几乎 spring-test 模块中所有的注解(例如:@ContextConfiguration、@WebAppConfiguration、@ContextHierarchy、@ActiveProfiles 等等)可以用作元注解来创建自定义的 composed annotations 并且可以减少测试套件的配置。
- 现在可以以编程方式解决 Bean 定义配置文件的激活。只需要实现一个自定义的 ActiveProfilesResolver,并且通过 @ActiveProfiles的resolver 属性注册。
- 新的 SocketUtils 类被引入到了 spring-core 模块。
3.2 spring 4.1
3.2.1 新增特性
- 核心部分基本上无变化,提供了 DirectFieldAccessor 用于直接字段访问、yaml 配置、SpEL 的字节码编译化、BackOff 退避算法的基本实现、Base64Utils、SmartInitializingSingleton等;
- 在任务调度和事件机制上加入了异常处理部分;
- cache 部分加入 jcache 的集成、类级别的 @CacheConfig 的支持、CacheResolver;
- mvc 部分提供了一些视图解析器的 mvc 标签实现简化配置、提供了 GroovyWebApplicationContext 用于 Groovy web 集成、提供了 Gson、protobuf 的 HttpMessageConverter、静态资源处理方面添加了 resolver和 transformer、提供了对 groovy-templates 模板的支持、JSONP 的支持、对 Jackson 的 @JsonView 的支持等;
- 提供了页面自动化测试框架 Spring MVC Test HtmlUnit;
- test 部分提供了更便利的 @sql 标签来执行测试脚本的初始化、MockRestServiceServer 对 AyncRestTemplate 支持、MockMvcConfigurer 来全局配置 MockMvc;
- 提供了对 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 4.1 新特性——综述
BigZ的专栏–Spring 4.0 新功能和增强
中文翻译 Spring Framework 4.x参考文档