Spring 3.1发布GA版本了

时间:2017-12-05 08:58

SpringSource在上个月中旬发布了Spring 3.1的GA版本。通过InfoQ先前的一篇文章,我们了解了Spring 3.1主要的新功能,其中包括对Java 7的支持,还有环境抽象和缓存抽象。

Chris Beams是Spring框架的主要提交者,InfoQ就Spring 3.1发布的更多细节和Spring 3.2的计划对他进行了采访。

InfoQ:Spring 3.1原计划是在2011年6月底发布GA版本。为什么会推迟到现在呢?

我们原计划要为Spring容器提供完全基于Java的配置,但这种方法在试行一段时间之后,甚至能作为完整里程碑的时候,我们对这种方法进行了反思;这种方法并不能完全满足我们的设计目标。一次完整的设计迭代之后,我们把目前的方法做成了@Enable*注解。

我们很早就开始支持Servlet 3.0容器,也遇到了一些容器实现自身的问题。我们不得不和实现容器的团队一起做一些迭代,来确保实现是正确的。

不过真正的主要原因是我们有意地扩大了范围,好让3.1就包括对Java 7提供支持,而不是等到3.2再开始。这主要围绕对fork/join的支持和JDBC 4.1。我们还决定,要尽可能早地支持Hibernate 4,甚至在他们发布最终版本之前。目前我们用的是Hibernate 4的RC 7版本,实际上我们的发布版本也基于RC 7,所以Hibernate 4.0的最终版本一旦可用,Spring 3.1.1就会立即升级去支持Hibernate 4.0最终版。

另外值得一提的是,我们不想让时间追着跑,而是尽可能提供最好的版本。所以它是连续、完整的,也能保证对用户来说是真正有意义的。

InfoQ:Spring对Java 7提供了支持,这是不是能直观反映出Java 7的运用会比Java 5和Java 6更为迅速?

我认为是有可能的。Open JDK和IBM都已经发布了JDK 7,这是个好迹象。我们可以预测,选择基于OpenJDK 7的Tomcat 7是自然而然的。

我们当然希望Java 7能被迅速采用,在一定程度上,我们也希望能助它的推广和提升一臂之力。如果Spring有一个版本能为人们打开一道门,或许Java 7的推广能变得更加容易一些。

InfoQ:Spring 3.1还利用了Java 7的其他哪些功能?像try-with-resources或其他Project Coin功能使用了么?

我们一直记着这些功能,还有Java 8里的语言特性,但Spring 3.1并没有过多地利用它们。大部分新特性在针对特定API的时候都很方便,比如multi-catch、try-with-resources和switch语句支持String,而不像泛型这种语言特性会直接影响API供应商。值得注意的是,Spring 3.2将会关注JMS 2,并有可能和try-with-resources保持一致。让我们拭目以待。

InfoQ:你刚刚提到你们引入了环境抽象的概念。能给我们一个在哪里会使用它的例子么?

环境支持实际上可以分为两类:一类是属性源抽象的概念,第二类是Bean定义Profile。

就属性源来说,你要是琢磨过Java设计,就知道获取属性的方式有很多,比如系统环境变量、JVM系统属性、真正的Map或Property对象,或从数据库或键值存储里获得。但从语义上来说,这些属性都有共同点。它们基本上都是改变环境的配置属性。那属性源抽象就是个简单的SPI(服务提供者接口),其实现能为应用配置提供键值对形式的后端存储。把属性源抽象加到Spring环境里的具体做法是,由环境维护这些你能操作和查询的属性源的层次化结构。举例来说,Spring的StandardEnvironment适用于独立应用,直接使用时可以带有表示环境变量和JVM系统属性的属性源。对Web应用来说,Spring的StandardWebEnvironment会把Servlet的init-params、context-params和JNDI属性源混杂在一起。Environment已经深度集成到了整个容器和Spring的property-placeholder机制里;这个概念能提供一致的抽象,这样你就可以说:“Spring,告诉我这个属性的值”,应用也不需要知道或关心这个值从哪里来。

第二部分是Bean定义Profile,这通常能让你基于应用的部署环境(比如开发环境、测试环境、生产环境,或者相对于传统环境的云环境)有条件地注册Bean定义。所以举例来说,相对于生产环境,你可以在开发环境下使用Spring的JDBC命名空间和嵌入式数据库构建器等内容来预设一个嵌入式数据库,然后在生产环境里,应用可以从JNDI获取数据源。

过去一段时间里我们发现有很多这样的需求,目前这也能被很好地接受了。我们希望看到人们用各种方式把它利用起来。

InfoQ:本次发布的另一个重磅内容是Spring Cache。Spring Cache和Spring Data项目是怎么协调的?

Spring 3.1的缓存抽象是个SPI,主要包括需要由后端缓存提供者去实现的Cache和CacheManager接口。然后还有一些共同构成声明性编程模型的注解,比如@Cacheable、@CachePut、@CacheEvict等。