Spring Java 配置的未来发展

工程 | Rod Johnson | 2007年11月5日 | ...

一些用户询问我们是否致力于Spring Java 配置,以及它与Spring 2.5中引入的注解配置选项的关系。答案是肯定的,我们致力于 Java 配置;这两种方法并非相互排斥。

这两种配置方法截然不同:Spring Framework 中的 @Autowired 注解使用业务对象中的注解来配置组件,而 Spring Java Config 采用了一种独特的方法,将注解外部化到专门的配置类中。这两种方法本身并没有绝对的对错之分,它们在不同的情况下都具有优势。甚至可以在同一个应用程序中同时使用这两种方法。

如果您认为 Spring = XML,那么现在是时候重新思考了。(无论如何,这从来都不是完全准确的,因为 Spring 核心容器一直使用它自己的 Java 元数据,并且不知道 XML 或任何其他表示形式。)

这让我们想到了一个重要的哲学原则:我们 Spring 的使命是为企业级 Java 提供最佳的组件模型,设定灵活性的标准以满足复杂的需求,并为现实世界的问题提供全面的解决方案。我们不相信存在任何一种万能的配置模型,我们相信在强大且可扩展的模型中容纳选择。无论您选择如何定义 Spring 管理的对象,它们都符合同样丰富的企业服务、无与伦比的第三方集成、真正的 AOP、许多扩展点等等。

因此,Spring 2.5 的 @Component 和 @Autowired 注解(它们使容器能够自动检测 Spring 管理的对象)可以与 Java 配置、XML 和其他配置选项愉快地共存。

这让我想到:我将在本周晚些时候在旧金山 QCon 上讨论配置 Spring 容器的方法,并且获得反馈应该会很有趣。我将看看之后是否可以在这里或 SpringFramework.org 上发布幻灯片。

由于 Costin 致力于Spring 用于 OSGi 的动态模块,Spring Java 配置有一段时间进展缓慢,但现在它已经步入正轨。在过去的几天里,我做了一些工作:将其更新到 Spring 2.5;删除未使用的代码;并添加了一个经常被请求的新功能——配置值的外部化以及 Bean。

虽然 M2 在 2.5RC1 上运行良好(考虑到 JavaConfig 对 Spring IoC 的深度使用,这是一个关于 2.5 向后兼容性的相当有力的论断),但它包含了自己的注解扫描代码(Spring Framework 采用并继续发展了该代码),因此迁移到更高版本的 Spring 更有意义。

新的配置属性外部化功能采纳了JIRA 中的一个建议,使用抽象方法(感谢 Guillaume Duchesneau)。

这些方法使用新的 @ExternalValue 注解进行注解,如下所示

@Configuration @ResourceBundles("classpath:/com/yourcompany/yourpackage/basename") static abstract class ConfigurationExample {
@Bean
public Person john() {
	Person john= new Person();
	john.setName(getName());
	john.setAge(methodWithArbitraryNameReturningAge());		
	john.setBusy(busy());
	return john;
}
	
    // Property name defaults to method name.
    // In the case of a getter method, it's the property name--
    // "name" in this case
@ExternalValue
public abstract String getName();
	

    // Property name is taken from annotation value
@ExternalValue("age")                  
public abstract int methodWithArbitraryNameReturningAge();
	
@ExternalValue
protected abstract boolean busy();
	

}

Spring Java Config 子类化这些类来实现这些方法,以便在运行时返回外部化的属性。(它无论如何都会为了其他原因子类化配置类,例如缓存单例 bean 方法的返回值。)这些方法可以是公共的或受保护的。

配置类上的 @ResourceBundles 注解标识一个或多个要用于解析值的资源包,这些资源包可以通过方法名称或注解上的显式 String 值来标识。这些位置是 Spring 资源位置字符串。

使用 @ExternalBean 注解的方法可以是具体的,在这种情况下,如果没有找到外部值,则将使用实际的返回值,例如: @ExternalValue public int otherNumber() { return 25; } 此用法表示该值是可外部化的,但外部化它是可选的,就像具有可用默认值的 bean 属性一样。

正如您所料,示例的属性文件如下所示

name=John Doe age=45 busy=false

底层机制旨在可扩展,因此属性文件并非唯一选项,我们将在未来的版本中提供更多选项。抽象方法方法允许动态获取值:例如,来自数据库或自定义,来自另一个系统。

目前,该示例仅适用于 SVN,但我们计划在本月发布 M3 版本。展望未来,Chris Beams(一位新的位于西雅图的 Interface21 顾问)将参与该项目。在 Interface21,我们相信我们所有的技术人员都应该完成我们公司所做的一切:开发产品、咨询和培训。产品开发人员提供一些培训和咨询;服务交付人员参与项目。这确保每个人都能为我们都关心的开源项目做出贡献,并且每个人都扎根于现实世界的业务需求,而不是在光荣的孤立中开发基础设施(过去在 J2EE 中看到的危险)。Chris 主要从事咨询和培训,但他将与 Spring Java Config “对齐”,使其成为他的主要开发重点,因此他应该会花大量时间在开发上,并得到 Costin 和我的帮助。

Spring Java Config 达到 1.0 正式版需要多长时间部分取决于您。我们需要关于实际使用情况的反馈;我们需要功能请求(尽管我们可能希望将 1.0 的范围保持在可控范围内);我们需要帮助进行优先级排序。如果您想要这个,请告诉我们,我们会倾听!

获取 Spring 电子报

通过 Spring 电子报保持联系

订阅

领先一步

VMware 提供培训和认证,以加快您的进度。

了解更多

获得支持

Tanzu Spring 在一个简单的订阅中提供对 OpenJDK™、Spring 和 Apache Tomcat® 的支持和二进制文件。

了解更多

即将举行的活动

查看 Spring 社区中所有即将举行的活动。

查看全部