SpringBoot-mybatis-Aop多数据源配置

1.定义数据源类型

/**
 * contextHolder保存一个线程安全的 dataBaseType
 * @author xuyp
 *
 */
public class DatabaseContextHolder {

	private static final ThreadLocal<DataBaseType> contextHolder = new ThreadLocal<>();
	
	public enum DataBaseType {//数据源类型
		bpmDataBase,
		pasDataBase
	}
	
	public static DataBaseType getDataBaseType() {
		return contextHolder.get();
	}
	
	public static void setDataBaseType(DataBaseType dbType) {
		contextHolder.set(dbType);
	}
}

2.动态数据源 

/**
 * 动态数据源(需要继承AbstractRoutingDataSource)
 * @author xuyp
 */
public class DynamicDataSource extends AbstractRoutingDataSource{

	@Override
	protected Object determineCurrentLookupKey() {
		return DatabaseContextHolder.getDataBaseType();
	}

}

3.根据Service类型Aop动态切换数据源

/**
 * @author xuyp
 * Aop动态切换数据源
 */
@Aspect
@Component
public class DataSourceAspect {
	/**
	 * 使用空方法定义切点表达式
	 */
	@Pointcut("execution(* com.monitor.service.**.*(..))")
    public void declareJoinPointExpression() {
    	
    }
	@Before("declareJoinPointExpression()")
	public void setDataSourceKey(JoinPoint jPoint) {
		//根据实例类型动态切换数据源
		if(jPoint.getTarget() instanceof IBpmDataService) {
			DatabaseContextHolder.setDataBaseType(DataBaseType.bpmDataBase);
		}
		if(jPoint.getTarget() instanceof IPasService) {
			DatabaseContextHolder.setDataBaseType(DataBaseType.pasDataBase);
		}
	}
}

4.数据源配置

/**
 * 数据源配置
 * @author xuyp
 */
@Configuration
@MapperScan(basePackages="com.monitor.mapper",sqlSessionTemplateRef="sqlSessionFactoryTemplate")
public class DataSourceConfig {
    @Primary
	@Bean(name="bpmDataSource")
    @ConfigurationProperties(prefix="spring.datasource.bpm")
	public DataSource getDataSourceBpm() {
		return DataSourceBuilder.create().build();
	}
    
    @Bean(name="pasDataSource")
    @ConfigurationProperties(prefix="spring.datasource.pas")
	public DataSource getDataSourcePas() {
		return DataSourceBuilder.create().build();
	}
    /**
     * 动态数据源
     * @param bpmDataSource
     * @param pasDataSource
     * @return
     */
    @Bean(name="dynamicDataSource")
    public DynamicDataSource dataSource(@Qualifier("bpmDataSource") DataSource bpmDataSource,
    		@Qualifier("pasDataSource") DataSource pasDataSource) {
    	Map<Object,Object> targetDataSource = new HashMap<>();
    	targetDataSource.put(DataBaseType.bpmDataBase, bpmDataSource);
    	targetDataSource.put(DataBaseType.pasDataBase, pasDataSource);
    	DynamicDataSource dataSource = new DynamicDataSource();
    	dataSource.setTargetDataSources(targetDataSource);
    	dataSource.setDefaultTargetDataSource(bpmDataSource);//默认数据源
    	return dataSource;
    }
    /**
     * 创建工厂
     * @param dynamicDataSource
     * @return
     * @throws Exception
     */
    @Bean(name="sqlSessionFactory")
    public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource")
          DataSource dynamicDataSource) throws Exception {
    	SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
    	bean.setDataSource(dynamicDataSource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver()
        .getResources("classpath*:mapper/*.xml"));
        return bean.getObject();
    }
    
    /**
     * 事务管理
     * @param dynamicDataSource
     * @return
     */
    @Bean("dataSourceTransactionManager")
    public DataSourceTransactionManager 
       dataSourceTransactionManager(@Qualifier("dynamicDataSource") 
       DataSource dynamicDataSource) {
    	return new DataSourceTransactionManager(dynamicDataSource);
    }
    /**
     * 创建模板
     * @param sqlSessionFactory
     * @return
     */
    @Bean(name="sqlSessionFactoryTemplate")
    public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory")
        SqlSessionFactory sqlSessionFactory) {
    	return new SqlSessionTemplate(sqlSessionFactory);
    }
}

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值