2013-10-10 26 views
0

假設我有定義爲Spring bean的幾個不同的數據源:使用Spring Bean的非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> 

現在,我想用這些數據源豆之一,但來自非簧豆容器。我可以調用appContext.getBean(「dataSource1」),但我讀過這是不好的做法,因爲它會在代碼中創建對Spring框架的顯式依賴。有沒有更好的方法來完成這個不是特定於實現的方式?也許像DatasourceFactory.getInstance(「datasource1」)?

這是一個奇怪的請求?我意識到如果容器類是Spring bean,這很容易,因爲我可以在這種情況下使用標準的依賴注入。但這是我一直很好奇的。看起來使用依賴注入創建了一個無限循環,如果你想在一個類中使用Spring bean,那麼這個類也必須是一個bean,然後如果另一個類想要使用該bean,那麼它也必須是一個bean,等等等等。我沒有看到打破依賴注入鏈的優雅方式。

同樣,也許沒有必要打破這個鏈條,也許答案是,你的所有課程都是春豆,但我只是好奇而已。

服務定位符模式可以應用在這裏嗎?如果有人能提供一個例子嗎?謝謝。

回答

1

您描述的方法是實現它的經典方法。

public class UnmanagedBean { 
    public UnmanagedBean(DataSource dataSource) { 
     ... // do something 
    } 
} 

... 

ApplicationContext context = ...; 
DataSource dataSource2 = context.getBean("dataSource2"); 
UnmanagedBean bean = new UnmanagedBean(dataSource2); 

您可以添加一個BeanProvider類,這是否對你的抽象級別,但你只能直接從ApplicationContext獲得豆。