2012-02-20 39 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()