【问题标题】:Use Spring Bean in Non-Spring Bean container class在非 Spring Bean 容器类中使用 Spring Bean
【发布时间】:2013-10-10 15:29:08
【问题描述】:

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

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

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

【问题讨论】:

    标签: spring dependency-injection javabeans


    【解决方案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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多