假设我有几个不同的数据源定义为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,等等等等。我没有看到打破依赖注入链的优雅方式。
同样,也许没有必要打破链条,也许答案是你确实让你所有的课程都是春天的豆子,但我只是好奇。
可以在此处应用服务定位器模式吗?如果有的话可以提供一个例子吗?感谢。
答案 0 :(得分:1)
您描述的方法是经典的方法。
public class UnmanagedBean {
public UnmanagedBean(DataSource dataSource) {
... // do something
}
}
...
ApplicationContext context = ...;
DataSource dataSource2 = context.getBean("dataSource2");
UnmanagedBean bean = new UnmanagedBean(dataSource2);
您可以使用BeanProvider
类添加抽象级别,为您执行此操作,但您只能直接从ApplicationContext
获取bean。