上一篇講了《基於註解的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引數進行指定。