Springboot + HikariCp + MybatisPlus多数据源配置 注解切换数据源 (2)

多数据源实现请参考上文
Springboot + HikariCp + MybatisPlus多数据源配置 (1)

由于手动切换在我看来并不优雅,但他最主要的是能够让我少写点代码。所以出现了Aop

首先引入aop依赖

	<dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-aop</artifactId>
	 </dependency>

定义注解@DB

	@Target({ ElementType.METHOD, ElementType.TYPE })
	@Retention(RetentionPolicy.RUNTIME)
	@Documented
	@Inherited
	public @interface DB
	{
	    /**
	     * 切换数据源名称
	     */
	     DataSourceType value() default DataSourceType.DB1;
	}

接下来我们对注解进行Aop,通过注解value切换数据源

	@Aspect
	//配置加载顺序
	@Order(1)
	@Component
	public class DataSourceAspect {
	
	    @Pointcut("@annotation(com.south.system.annotation.DB)")
	    public void doPointCut(){}
	
	    @Around("doPointCut()")
	    public Object around(ProceedingJoinPoint point) throws Throwable {
	        DB dataSource = getDataSource(point);
	        if (!Objects.isNull(dataSource)){
	            DynamicDataSourceContextHolder.setDataSourceType(dataSource.value().name());
	        }
	        try {
	            return point.proceed();
	        }
	        finally {
	            // 在执行方法之后 销毁数据源
	            DynamicDataSourceContextHolder.clearDataSourceType();
	        }
	    }
	
	    /**
	     * 获取@DB注解
	     */
	    public DB getDataSource(ProceedingJoinPoint point){
	
	        //获得当前访问的class
	        Class<? extends Object> className = point.getTarget().getClass();
	
	        // 判断是否存在@DateBase注解
	        if (className.isAnnotationPresent(DB.class)) {
	            //获取注解
	            DB targetDataSource = className.getAnnotation(DB.class);
	            return targetDataSource;
	        }
	
	        Method method = ((MethodSignature)point.getSignature()).getMethod();
	        DB dataSource = method.getAnnotation(DB.class);
	        return dataSource;
	
	    }
	}

这时候只需要在方法或者类上加上一个注解,就可以达到切换数据源的效果了

测试

	@Service
	public class DbServiceImpl implements DbService {
	
	    @Autowired
	    private SysUserOneDao sysUserOneDao;
	
	    @Autowired
	    private SysTwoDao sysTwoDao;
	
	    @DB
	    @Override
	    public SysUserOne getUser(long id) {
	        return sysUserOneDao.selectById(id);
	    }
	
	    @DB(DataSourceType.DB2)
	    @Override
	    public SysTwo getTwo(long id) {
	        return sysTwoDao.selectById(id);
	    }
	}

结果:

Springboot + HikariCp + MybatisPlus多数据源配置 注解切换数据源 (2)_第1张图片
这里不添加注解的话还是使用的默认数据源

存在问题:

多数据源事务问题

Demo地址:https://github.com/South7i/dynamicdb

你可能感兴趣的:(SpringBoot)