81,122
社区成员




public class WorkOrderTest {
public static void main(String[] args) {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext(new String[]{"spring-mvc.xml","spring-mybatis.xml"});
WorkOrderService workOrderService=(WorkOrderService) applicationContext.getBean("workOrderService");
// MultipleDataSource.setDataSourceKey("vso1DataSource"); //这一句是手动切换数据源的代码。手动切换没问题。
Long id=100000004220380L;
WorkOrder workOrder= workOrderService.selectByPrimaryKey(id);
System.out.println("===================>BillId:"+workOrder.getBillId());
}
}
public MultipleDataSourceAspectAdvice(){
System.out.println("==========================>MultipleDataSourceAspectAdvice构造函数。");
}
public class WorkOrderServiceImpl implements WorkOrderService{
@Autowired
private WorkOrderDao workOrderDao;
@Override
public WorkOrder selectByPrimaryKey(Long id) {
return workOrderDao.selectByPrimaryKey(id);
}
}
/**
* 配置多个数据源
*/
public class MultipleDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<String> dataSourceKey = new InheritableThreadLocal<String>();
public static void setDataSourceKey(String dataSource) {
dataSourceKey.set(dataSource);
}
@Override
protected Object determineCurrentLookupKey() {
return dataSourceKey.get();
}
}
public interface WorkOrderDao {
WorkOrder selectByPrimaryKey(@Param("id") Long id);
}
@Service("workOrderService")
public interface WorkOrderService {
WorkOrder selectByPrimaryKey(Long id);
}
/**
* 通过aop在每次调用前自动切换数据源。不用手动切换。
*/
@Component
@Aspect
@Order(0)
public class MultipleDataSourceAspectAdvice {
@Pointcut("execution (* com.cmsz.crm..*.*(..))")
private void cutMethod() {} // 声明一个切入点,cutMethod为切入点名称
//此处拦截的类,或者方法,需要修改。。不正确的话,无法拦截。
@Around("cutMethod()")
public Object doAround(ProceedingJoinPoint jp) throws Throwable {
System.out.println("==========================>开始进行aop操作:");
if (jp.getTarget() instanceof EsbTraceDao) {
MultipleDataSource.setDataSourceKey("vbaseDataSource");
} else if (jp.getTarget() instanceof WorkOrderDao) {
MultipleDataSource.setDataSourceKey("vso1DataSource");
}else {
System.out.println("==================>proceedingJoinPoint.getTarget():"+jp.getTarget());
}
return jp.proce