支持多数据源
parent
ad322f6948
commit
5a0ab9bfac
@ -0,0 +1,60 @@
|
|||||||
|
package com.ruoyi.framework.aspectj;
|
||||||
|
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import org.aspectj.lang.ProceedingJoinPoint;
|
||||||
|
import org.aspectj.lang.annotation.Around;
|
||||||
|
import org.aspectj.lang.annotation.Aspect;
|
||||||
|
import org.aspectj.lang.annotation.Pointcut;
|
||||||
|
import org.aspectj.lang.reflect.MethodSignature;
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
import org.springframework.core.annotation.Order;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
import com.ruoyi.common.utils.StringUtils;
|
||||||
|
import com.ruoyi.framework.aspectj.lang.annotation.Ds;
|
||||||
|
import com.ruoyi.framework.datasource.DataSourceContextHolder;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多数据源处理
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
@Aspect
|
||||||
|
@Order(1)
|
||||||
|
@Component
|
||||||
|
public class DsAspect
|
||||||
|
{
|
||||||
|
protected Logger logger = LoggerFactory.getLogger(getClass());
|
||||||
|
|
||||||
|
@Pointcut("@annotation(com.ruoyi.framework.aspectj.lang.annotation.Ds)")
|
||||||
|
public void dataSourcePointCut()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Around("dataSourcePointCut()")
|
||||||
|
public Object around(ProceedingJoinPoint point) throws Throwable
|
||||||
|
{
|
||||||
|
MethodSignature signature = (MethodSignature) point.getSignature();
|
||||||
|
|
||||||
|
Method method = signature.getMethod();
|
||||||
|
|
||||||
|
if (method.isAnnotationPresent(Ds.class))
|
||||||
|
{
|
||||||
|
Ds dataSource = method.getAnnotation(Ds.class);
|
||||||
|
if (StringUtils.isNotNull(dataSource) && StringUtils.isNotEmpty(dataSource.name()))
|
||||||
|
{
|
||||||
|
DataSourceContextHolder.setDB(dataSource.name());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
return point.proceed();
|
||||||
|
}
|
||||||
|
finally
|
||||||
|
{
|
||||||
|
DataSourceContextHolder.clearDB();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,23 @@
|
|||||||
|
package com.ruoyi.framework.aspectj.lang.annotation;
|
||||||
|
|
||||||
|
import java.lang.annotation.ElementType;
|
||||||
|
import java.lang.annotation.Retention;
|
||||||
|
import java.lang.annotation.RetentionPolicy;
|
||||||
|
import java.lang.annotation.Target;
|
||||||
|
|
||||||
|
import com.ruoyi.framework.aspectj.lang.constant.DataSourceName;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 自定义多数据源切换注解
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
@Target(ElementType.METHOD)
|
||||||
|
@Retention(RetentionPolicy.RUNTIME)
|
||||||
|
public @interface Ds
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* 切换数据源值
|
||||||
|
*/
|
||||||
|
String name() default DataSourceName.MASTER;
|
||||||
|
}
|
@ -0,0 +1,16 @@
|
|||||||
|
package com.ruoyi.framework.aspectj.lang.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 多数据源别名
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class DataSourceName
|
||||||
|
{
|
||||||
|
/** 主库 */
|
||||||
|
public static final String MASTER = "master";
|
||||||
|
|
||||||
|
/** 从库 */
|
||||||
|
public static final String SLAVE = "slave";
|
||||||
|
}
|
@ -0,0 +1,35 @@
|
|||||||
|
package com.ruoyi.framework.datasource;
|
||||||
|
|
||||||
|
import org.slf4j.Logger;
|
||||||
|
import org.slf4j.LoggerFactory;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 当前线程数据源
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
public class DataSourceContextHolder
|
||||||
|
{
|
||||||
|
public static final Logger log = LoggerFactory.getLogger(DataSourceContextHolder.class);
|
||||||
|
|
||||||
|
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
|
||||||
|
|
||||||
|
// 设置数据源名
|
||||||
|
public static void setDB(String dbType)
|
||||||
|
{
|
||||||
|
log.info("切换到{}数据源", dbType);
|
||||||
|
contextHolder.set(dbType);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 获取数据源名
|
||||||
|
public static String getDB()
|
||||||
|
{
|
||||||
|
return contextHolder.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void clearDB()
|
||||||
|
{
|
||||||
|
contextHolder.remove();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,27 @@
|
|||||||
|
package com.ruoyi.framework.datasource;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
import javax.sql.DataSource;
|
||||||
|
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 动态数据源
|
||||||
|
*
|
||||||
|
* @author ruoyi
|
||||||
|
*/
|
||||||
|
public class DynamicDataSource extends AbstractRoutingDataSource
|
||||||
|
{
|
||||||
|
public DynamicDataSource(DataSource defaultTargetDataSource, Map<Object, Object> targetDataSources)
|
||||||
|
{
|
||||||
|
super.setDefaultTargetDataSource(defaultTargetDataSource);
|
||||||
|
super.setTargetDataSources(targetDataSources);
|
||||||
|
super.afterPropertiesSet();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected Object determineCurrentLookupKey()
|
||||||
|
{
|
||||||
|
return DataSourceContextHolder.getDB();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -1,40 +0,0 @@
|
|||||||
package com.ruoyi.common.utils;
|
|
||||||
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* AddressUtils Tester.
|
|
||||||
*
|
|
||||||
* @author Leonhardt
|
|
||||||
* @version 1.0
|
|
||||||
* @since 07/22/2018
|
|
||||||
*/
|
|
||||||
|
|
||||||
public class AddressUtilsTest
|
|
||||||
{
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void before() throws Exception
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void after() throws Exception
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: getRealAddressByIP(String ip)
|
|
||||||
* <p>
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testGetRealAddressByIP() throws Exception
|
|
||||||
{
|
|
||||||
// TODO: Test goes here...
|
|
||||||
String ipAddress = AddressUtils.getRealAddressByIP("121.8.250.1");
|
|
||||||
System.out.println(ipAddress);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,124 +0,0 @@
|
|||||||
package com.ruoyi.project.system.dept.service;
|
|
||||||
|
|
||||||
import org.junit.After;
|
|
||||||
import org.junit.Assert;
|
|
||||||
import org.junit.Before;
|
|
||||||
import org.junit.Test;
|
|
||||||
import org.junit.runner.RunWith;
|
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
|
||||||
import org.springframework.boot.test.context.SpringBootTest;
|
|
||||||
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* DeptServiceImpl Tester.
|
|
||||||
*
|
|
||||||
* @author Leonhardt
|
|
||||||
* @version 1.0
|
|
||||||
* @since 07/22/2018
|
|
||||||
*/
|
|
||||||
@RunWith(SpringJUnit4ClassRunner.class)
|
|
||||||
@SpringBootTest
|
|
||||||
public class DeptServiceImplTest
|
|
||||||
{
|
|
||||||
@Autowired
|
|
||||||
private IDeptService deptService;
|
|
||||||
|
|
||||||
@Before
|
|
||||||
public void before() throws Exception
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
@After
|
|
||||||
public void after() throws Exception
|
|
||||||
{
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: selectDeptList(Dept dept)
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testSelectDeptList() throws Exception
|
|
||||||
{
|
|
||||||
// TODO: Test goes here...
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: selectDeptAll()
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testSelectDeptAll() throws Exception
|
|
||||||
{
|
|
||||||
// TODO: Test goes here...
|
|
||||||
Assert.assertEquals(deptService.selectDeptAll().size(), 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: selectDeptTree()
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testSelectDeptTree() throws Exception
|
|
||||||
{
|
|
||||||
// TODO: Test goes here...
|
|
||||||
List<Map<String, Object>> trees = deptService.selectDeptTree();
|
|
||||||
trees.stream().forEach(tree -> System.out.println(tree));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: selectDeptCount(Long parentId)
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testSelectDeptCount() throws Exception
|
|
||||||
{
|
|
||||||
// TODO: Test goes here...
|
|
||||||
Assert.assertEquals(10, deptService.selectDeptCount(0L));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: checkDeptExistUser(Long deptId)
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testCheckDeptExistUser() throws Exception
|
|
||||||
{
|
|
||||||
// TODO: Test goes here...
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: deleteDeptById(Long deptId)
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testDeleteDeptById() throws Exception
|
|
||||||
{
|
|
||||||
// TODO: Test goes here...
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: saveDept(Dept dept)
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testSaveDept() throws Exception
|
|
||||||
{
|
|
||||||
// TODO: Test goes here...
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: selectDeptById(Long deptId)
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testSelectDeptById() throws Exception
|
|
||||||
{
|
|
||||||
// TODO: Test goes here...
|
|
||||||
Assert.assertNotNull("若依集团不存在", deptService.selectDeptById(100L));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Method: checkDeptNameUnique(Dept dept)
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testCheckDeptNameUnique() throws Exception
|
|
||||||
{
|
|
||||||
// TODO: Test goes here...
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
Loading…
Reference in New Issue