前言
之前我寫過一篇數據源自動切換的博文,點擊查看=>多數據源自動切換,里面用兩種方式實現了多數據源自動切換,但是無論是自己實現還是用官方的輪子,都有一個痛點,就是在請求數據源不是默認數據源的時候,要重復的用注解來切換數據源,這樣很繁瑣,近期看到同事的一個實現,眼前一亮,覺得有必要單獨寫一篇文章來分享一下,實現方式原理還是和我上面那篇文章里的一樣,不同的是用切面和約定的方式實現全自動切換數據源。
本次代碼示例會簡單表述優化的內容,不會有完整代碼,建議在操作實現完多數據源自動切換里的代碼后再看本文章。
正片開始
寫一個數據源枚舉類
@Getter
@AllArgsConstructor
public enum DBTypeEnum {
PRIMARY("primary"),
LOCAL("local"),
PROD("prod");
private final String value;
}
寫一個切面類
@Component
@Order(value = -999)
@Slf4j
@Aspect
public class DataSourceSwitchAspect {
@Pointcut("execution(* com.along.mapper.primary..*.*(..)) || execution(* com.along.service.primary..*.*(..))")
private void primaryAspect() {
}
@Pointcut("execution(* com.along.mapper.local..*.*(..)) || execution(* com.along.service.local..*.*(..))")
private void localAspect() {
}
@Pointcut("execution(* com.along.mapper.prod..*.*(..)) || execution(* com.along.service.prod..*.*(..))")
private void prodAspect() {
}
@Before("primaryAspect()")
public void upms() {
DbContextHolder.setDbType(DBTypeEnum.PRIMARY);
}
@Before("localAspect()")
public void local() {
DbContextHolder.setDbType(DBTypeEnum.LOCAL);
}
@Before("prodAspect()")
public void prod() {
DbContextHolder.setDbType(DBTypeEnum.PROD);
}
}
看到這是不是很清晰了,用切面的方式,監控指定的文件夾,當請求調用到指定的文件夾里的類前,自動切換數據源為對應的數據源。
這樣配置完之后我們就不在需要手動切換數據源,只需要開發過程中按照遵守項目約定好的規范,把mapper接口類放在指定的目錄內,就無需關心數據庫是怎么切換的。
這樣基本就分享完了,改動很簡單,主要就是提供一個思路,具體的實現大家在真實項目中可以根據實際情況自由發揮。