2012-02-20 42 views
3

我是Spring的新手,并且阅读了很多有关如何注入Bean的指南。奇怪的是,在我看到的每个例子中,他们在类main方法中使用了getBean(不是我所需要的)。我也读过很多论坛和有关如何不使用getBean的问题,但我仍然无法弄清楚我的应用程序的最佳方法。我仍然没有得到如何避免使用getBean()

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

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

+0

尝试过注释? – 2012-02-20 14:07:36

+1

如果你正在做新的MyDAO(),那么你不会让Spring构造对象,所以Spring不能向对象中注入任何东西。您需要在业务类实例中注入DAO。 – 2012-02-20 14:12:06

+0

@JB Nizet这是我的困境的一部分,如果我在业务类中注入DAO,我应该如何构建业务类?商业类也是由全新的运营商构建的。 – davidmontoyago 2012-02-20 14:25:18

回答

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实例的所有daoX豆之间,如果这就是你想要的。

然后可以使用如下因素来处理业务逻辑:

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

或者更好的是,使用类似Spring MVC的,可以电汇业务豆到您的控制器,而无需调用getBean()