在我上一篇文章中,我介绍了基本的 FactoryBean 是什么。虽然 FactoryBeans 很重要——了解它们的作用可以帮助你更有效地驾驭框架——但就 Spring 3.0 和即将发布的 Spring 3.1 而言,它们已不再是推荐的做法。
FactoryBean 的核心思想是隐藏对象的构造——因为它非常复杂,或者因为它不能仅仅使用 Spring 容器常用的以构造函数为中心的典型方法来实例化(也许它需要被查找?也许它需要一个静态注册方法?)。Spring 在 XML 格式中也支持 factory-method 属性。Java 配置方法提供了一个在概念上相似(实际上,结果相同)的替代方案,但具有更简洁、类型安全的选择。
Spring 3.0 引入了 Java 配置,它允许你使用 Java 定义 bean。例如,要在 XML 中将一个普通的 javax.sql.DataSource 注册到 Spring,你很可能会委托给一个属性文件来获取敏感的配置信息(如数据库密码),然后使用 Spring 来实例化 javax.sql.DataSource,如下所示:
<beans ...>
<context:property-placeholder location = "ds.properties" />
<bean id = "ds" class = "a.b.c.MySqlDataSource">
<property name = "user" value = "${ds.user}"/>
<property name = "password" value = "${ds.password}"/>
</bean>
</beans>
这是一个简单的 bean,自然地转化为 Java 配置。它看起来会是这样:
import a.b.c.* ;
@Configuration
@PropertySource("ds.properties")
public class MyConfiguration {
@Inject private Environment env ;
@Bean public MySqlDataSource ds(){
MySqlDataSource ds = new MySqlDataSource () ;
ds.setUser( env.getProperty("ds.user") );
ds.setPassword( env.getProperty("ds.password…