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