由于您使用的是依赖注入,因此您应该尝试使用相关 DI 框架提供的开箱即用的接线,而不是编写自己的工厂。
可以使用 SpringPropertyPlaceHolder 和 spring 配置文件中围绕 DAO 命名的简单约定来解决当前问题。
步骤:
1.首先使用一些命名约定来命名您的各个DAO的Id并在spring文件中配置它们。
例如:
<bean id='hibernateUserDao' class='UserHibernateDao'/>
<bean id='ibatisUserDao' class='UserIbatisDao'/>
这里我们说所有的 Hibernate Daos 都以 hibernate 开头,所有的 ibatis Daos 都以 ibatis 等开头。
2.接下来配置Daos的消费者。确保布线是动态的,具体取决于属性。
<bean id='daoconsumer' class='some.consumer.class'>
<property name='dao' ref='${daoImpl}UserDao'/>
</bean>
3.然后在你的spring文件中配置Spring Property占位符。
<bean id="propertyConfigurator" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location">
<value>classpath:/path/to/app.properties</value>
</property>
</bean>
4.最后你用单行编写app.properties。
daoImpl=hibernate # choose hibernate implementations.
现在,daoImpl 将被“休眠”取代。这种技术的另一个优点是 SpringPropertyPlaceHolder 还可以从环境中获取属性,它可以优先于 app.properties 使用(取决于配置参数,查找 javadocs 以获取详细信息)
因此,您也可以使用非常强大的环境属性来配置您的应用行为。
备选方案 2:
您还可以使用 Maven 配置文件来实现类似的行为。 Maven 能够“过滤”您的资源——在这种情况下,它会根据正在执行的 Maven 配置文件将占位符替换为一些字符串。您可以利用此功能生成适用于给定实现(如 hibernate、ibatis 等)的应用程序包(jar、ears 等)。显然,这不如 PropertyPlaceHolder 方法灵活,但在某些条件下可能更可取。