在非Spring Bean容器类中使用Spring Bean

时间:2013-10-10 15:29:08

标签: spring dependency-injection javabeans

假设我有几个不同的数据源定义为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,等等等等。我没有看到打破依赖注入链的优雅方式。

同样,也许没有必要打破链条,也许答案是你确实让你所有的课程都是春天的豆子,但我只是好奇。

可以在此处应用服务定位器模式吗?如果有的话可以提供一个例子吗?感谢。

1 个答案:

答案 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。