0

假设我有几个不同的数据源定义为 spring bean:

<bean id="dataSource1" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost/db1?user=root&amp;password=password" />
</bean>

<bean id="dataSource2" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost/db2?user=root&amp;password=password" />
</bean>

现在我想使用这些数据源 bean 之一,但来自非 Spring bean 容器。我可以调用 appContext.getBean("dataSource1") 但我读过这是不好的做法,因为它在代码中创建了对 spring 框架的显式依赖。有没有更好的方法以非特定于实现的方式完成此任务?也许像 DatasourceFactory.getInstance("datasource1") 之类的?

这是一个奇怪的要求吗?我意识到如果容器类是 Spring bean,这将非常容易,因为在这种情况下我可以使用标准依赖注入。但这是我一直很好奇的事情。似乎使用依赖注入创建了一个无限循环,如果你想在一个类中使用一个spring bean,那么那个类也必须是一个bean,然后如果另一个类想要使用那个bean,那么它也必须是一个bean,等等等等。我没有看到打破依赖注入链的优雅方法。

再一次,也许没有必要打破链条,也许答案是你确实让你所有的课程都变成了弹簧豆,但我只是好奇。

可以在这里应用服务定位器模式吗?如果是这样,有人可以提供一个例子吗?谢谢。

4

1 回答 1

1

您描述的方法是经典的方法。

public class UnmanagedBean {
    public UnmanagedBean(DataSource dataSource) {
       ... // do something
    }
} 

...

ApplicationContext context = ...;
DataSource dataSource2 = context.getBean("dataSource2");
UnmanagedBean bean = new UnmanagedBean(dataSource2);

您可以使用为您执行此操作的类添加一个抽象级别BeanProvider,但您仅限于直接从ApplicationContext.

于 2013-10-10T15:45:07.673 回答