我仍然没有得到如何避免使用getBean()

时间:2012-02-20 14:04:36

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

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

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

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

1 个答案:

答案 0 :(得分: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>

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

然后,您可以使用以下内容来处理业务逻辑:

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

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