基於xml的Spring多資料來源配置和使用

無心碼農發表於2015-11-29

上一篇講了《基於註解的Spring多資料來源配置和使用》,透過在類或者方法上新增@DataSource註解就可以指定某個資料來源。這種方式的優點是控制粒度細,也更靈活。

但是當有些時候專案分模組開發,可能某一個模組只訪問同一個資料來源,這種場景下如果使用註解的話就要在這個模組下的所有dao介面都增加註解@DataSource,就會顯得繁瑣。

如果能直接在配置檔案中一次性配置好,不用在每個類都新增註解豈不是更好?當然也是可以的^_^。

首先,再建立一個AOP切面DataSourceAspect2,程式碼如下:

 1 public class DataSourceAspect2 {
 2 
 3     /**
 4      * 設定資料來源dataSource1
 5      * 
 6      * @param point
 7      */
 8     public void setDataSource1(JoinPoint point) {
 9         DynamicDataSourceHolder.setDataSource("dataSource1");
10     }
11 
12     /**
13      * 設定資料來源dataSource2
14      * 
15      * @param point
16      */
17     public void setDataSource2(JoinPoint point) {
18         DynamicDataSourceHolder.setDataSource("dataSource1");
19     }
20 
21 }

然後,配置這個切面的bean和攔截規則,xml配置如下:

 1 <bean id="dataSourceAspect2" class="com.test.context.datasource.DataSourceAspect2" />
 2 <aop:config>  
 3     <aop:aspect ref="dataSourceAspect2"> 
 4         <!-- 攔截ds1模組下的所有方法 -->
 5         <aop:pointcut id="dataSource1Pointcut" expression="execution(* com.test.ds1.*.*(..))" />
 6         <!-- 攔截ds2模組下的所有方法 -->        
 7         <aop:pointcut id=" dataSource2Pointcut" expression="execution(* com.test.ds2.*.*(..))" /> 
 8         <!-- 攔截到ds1模組後,在方法執行前先呼叫DataSourceAspect2裡的setDataSource1設定資料來源標識為dataSource1 -->
 9         <aop:before pointcut-ref="dataSource1Pointcut" method="setDataSource1" /> 
10         <!-- 攔截到ds2模組後,在方法執行前先呼叫DataSourceAspect2裡的setDataSource2設定資料來源標識為dataSource2 -->
11         <aop:before pointcut-ref="dataSource1Pointcut" method="setDataSource2" />  
12     </aop:aspect>  
13 </aop:config>  

這樣配置好之後,每個模組下的dao就只訪問指定的資料來源了。以後如果再增加資料來源dataSource3,則在DataSourceAspect2類裡增加一個方法setDataSource3(JoinPoint point),

並在上面的配置中增加類似的攔截規則就可以了。

假如使用了xml的方式配置了ds1模組使用資料來源dataSource1了,而ds1模組下的某個方法a又需要訪問資料來源dataSource2,這時可以單獨在a上使用註解@DataSource指定資料來源。

也就是說註解和xml配置兩種方式可以同時使用(但不建議這樣),至於兩者哪個的優先順序更高,可以透過配置aop:aspect裡的order引數進行指定。

相關文章