假设我有几个不同的数据源定义为 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&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&password=password" />
</bean>
现在我想使用这些数据源 bean 之一,但来自非 Spring bean 容器。我可以调用 appContext.getBean("dataSource1") 但我读过这是不好的做法,因为它在代码中创建了对 spring 框架的显式依赖。有没有更好的方法以非特定于实现的方式完成此任务?也许像 DatasourceFactory.getInstance("datasource1") 之类的?
这是一个奇怪的要求吗?我意识到如果容器类是 Spring bean,这将非常容易,因为在这种情况下我可以使用标准依赖注入。但这是我一直很好奇的事情。似乎使用依赖注入创建了一个无限循环,如果你想在一个类中使用一个spring bean,那么那个类也必须是一个bean,然后如果另一个类想要使用那个bean,那么它也必须是一个bean,等等等等。我没有看到打破依赖注入链的优雅方法。
再一次,也许没有必要打破链条,也许答案是你确实让你所有的课程都变成了弹簧豆,但我只是好奇。
可以在这里应用服务定位器模式吗?如果是这样,有人可以提供一个例子吗?谢谢。