超越 FactoryBean
我在之前的文章中探讨了基本的FactoryBean
是什么。虽然FactoryBean
很重要——了解它们的作用可以帮助你更有效地使用框架——但在Spring 3.0及即将推出的Spring 3.1中,它们已不再是推荐的解决方法。
FactoryBean
的重点是隐藏对象的构造——要么是因为它非常复杂,要么是因为它不能简单地使用Spring容器常用的构造函数中心方法进行实例化(也许需要查找?也许需要静态注册方法?)Spring还支持XML格式中的factory-method
属性。Java配置方法提供了一种概念上类似的(实际上,结果相同)替代方案,但它提供了一种更简洁、类型安全的替代方案。
Spring 3.0引入了Java配置,它允许你使用Java定义bean。例如,要在XML中使用Spring注册一个普通的javax.sql.DataSource
,你很可能会委托给一个属性文件来获取敏感的配置信息(如数据库密码),并使用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…