基於xml的Spring多數據源配置和使用


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM