【问题标题】:I still don't get how to avoid the use of getBean()我仍然不明白如何避免使用 getBean()
【发布时间】:2012-03-10 20:53:26
【问题描述】:

我是 Spring 新手,我已经阅读了许多关于如何注入 bean 的指南。奇怪的是,在我看到的每个示例中,他们在类主方法中使用 getBean (不是我需要的)。此外,我还阅读了许多与如何不使用 getBean 相关的论坛和问题,但我仍然无法为我的应用找出最佳方法。

我正在重构一个高度耦合且没有设计模式的 Web 应用程序。每个业务类都有一个相应的 DAO 类,每个 DAO 类都扩展了一个超级 DAO,它处理连接和其他东西。这里的问题是,每个 DAO 在构造函数中都需要一些从业务类传递的数据库配置参数。我想要做的是将这些参数放在一个 DBConfig bean 中,并将它们注入每个 DAO 中,这样我就可以简单地从每个业务类创建 DAO 对象,例如: dao =新的 myDAO()

如何“自动”将 DBConfig bean 注入每个 DAO?我应该在超级 DAO 中使用 getBean 吗?

【问题讨论】:

  • 如果你在做new MyDAO(),那么你就不让Spring构造对象,所以Spring不能向对象注入任何东西。您需要在业务类实例中注入 DAO。
  • @JB Nizet 这是我的困境的一部分,如果我在业务类中注入 DAO,我应该如何构建业务类?业务类也是由整个应用程序中的新运算符构建的。
  • 将业务类实例注入您的 UI 控制器或全局 ServiceRegistry 对象。有时,除非您使用支持 Spring 的 UI 框架,否则您将不得不调用 getBean()。但是在最顶层而不是在 DAO 层中这样做会好得多。您可以只使用一次来获取一个ServiceRegistry 对象,该对象注入了对所有业务类实例的引用,这些实例本身也注入了 DAO 实例。
  • 我认为@JBNizet 以前的 cmets 是最好的答案。

标签: spring inversion-of-control ioc-container


【解决方案1】:

您的配置可能如下所示:

<bean id="daoConfig1" class="com.foo.dao.DAOConfig">
    <property name="dbUrl" value="jdbc://urlForDao1" />
    ...
</bean>

<bean id="dao1" class="com.foo.dao.DAO1">
    <constructor-arg ref="daoConfig1" />
</bean>

<bean id="business1" class="com.foo.service.Business1">
    <property name="dao" ref="dao1" />
</bean>

<bean id="daoConfig2" class="com.foo.dao.DAOConfig">
    <property name="dbUrl" value="jdbc://urlForDao2" />
    ...
</bean>

<bean id="dao2" class="com.foo.dao.DAO2">
    <constructor-arg ref="daoConfig2" />
</bean>

<bean id="business2" class="com.foo.service.Business2">
    <property name="dao" ref="dao2" />
</bean>

或者在所有 daoX bean 之间共享一个 daoConfig 实例,如果这是你想要的。

然后您可以使用以下方式处理业务逻辑:

ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"beans.xml"});
Business1 b1 = (Business1) context.getBean("business1");
b1.doStuff();

或者更好的是,使用 Spring MVC 之类的东西,它可以将业务 bean 连接到您的控制器中,而无需调用 getBean()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-05
    • 1970-01-01
    相关资源
    最近更新 更多