diff --git a/pom.xml b/pom.xml index 569b712..9484ba9 100644 --- a/pom.xml +++ b/pom.xml @@ -29,7 +29,6 @@ org.springframework.boot spring-boot-starter-data-jdbc - com.baomidou mybatis-plus-boot-starter @@ -39,7 +38,10 @@ mysql mysql-connector-java - + + org.springframework.boot + spring-boot-starter-aop + org.springframework.boot spring-boot-starter-test diff --git a/src/main/java/com/dreamlyn/dynamic/DynamicApplication.java b/src/main/java/com/dreamlyn/dynamic/DynamicApplication.java index 2fd6793..ee9d85f 100644 --- a/src/main/java/com/dreamlyn/dynamic/DynamicApplication.java +++ b/src/main/java/com/dreamlyn/dynamic/DynamicApplication.java @@ -1,5 +1,6 @@ package com.dreamlyn.dynamic; +import com.dreamlyn.dynamic.annotation.RoutingWith; import com.dreamlyn.dynamic.entity.Menu; import com.dreamlyn.dynamic.entity.User; import com.dreamlyn.dynamic.mapper.MenuMapper; @@ -10,11 +11,14 @@ import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +import javax.annotation.PostConstruct; import java.util.List; -@SpringBootApplication +@Slf4j @MapperScan("com.dreamlyn.dynamic.mapper") +@SpringBootApplication(exclude = DataSourceAutoConfiguration.class) public class DynamicApplication { public static void main(String[] args) { SpringApplication.run(DynamicApplication.class, args); diff --git a/src/main/java/com/dreamlyn/dynamic/UseDynamicDatasource.java b/src/main/java/com/dreamlyn/dynamic/UseDynamicDatasource.java new file mode 100644 index 0000000..528f843 --- /dev/null +++ b/src/main/java/com/dreamlyn/dynamic/UseDynamicDatasource.java @@ -0,0 +1,34 @@ +package com.dreamlyn.dynamic; + +import com.dreamlyn.dynamic.annotation.RoutingWith; +import com.dreamlyn.dynamic.entity.Menu; +import com.dreamlyn.dynamic.mapper.MenuMapper; +import com.dreamlyn.dynamic.mapper.UserMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.ApplicationArguments; +import org.springframework.boot.ApplicationRunner; +import org.springframework.context.annotation.Configuration; + +import java.util.List; + +@Slf4j +@Configuration +public class UseDynamicDatasource implements ApplicationRunner { + + @Autowired + private MenuMapper menuMapper; + @Autowired + private UserMapper userMapper; + + @Override + @RoutingWith("slave") + public void run(ApplicationArguments args) throws Exception { + //设置数据源 + log.info("current dataSource key:{}", DynamicDataSourceContextHolder.getDataSource()); + List menus = menuMapper.selectList(null); + log.info("menu count:{}", menus.size()); +// List users = userMapper.selectList(null); +// log.info("user count:{}", users.size()); + } +} diff --git a/src/main/java/com/dreamlyn/dynamic/annotation/RoutingWith.java b/src/main/java/com/dreamlyn/dynamic/annotation/RoutingWith.java new file mode 100644 index 0000000..a29c0c6 --- /dev/null +++ b/src/main/java/com/dreamlyn/dynamic/annotation/RoutingWith.java @@ -0,0 +1,17 @@ +package com.dreamlyn.dynamic.annotation; + +import java.lang.annotation.*; + +/** + * + */ +@Target(ElementType.METHOD) +@Retention(RetentionPolicy.RUNTIME) +@Documented +public @interface RoutingWith { + /** + * 使用的数据源 + * @return + */ + String value() default "master"; +} \ No newline at end of file diff --git a/src/main/java/com/dreamlyn/dynamic/aspect/RoutingAspect.java b/src/main/java/com/dreamlyn/dynamic/aspect/RoutingAspect.java new file mode 100644 index 0000000..03ab724 --- /dev/null +++ b/src/main/java/com/dreamlyn/dynamic/aspect/RoutingAspect.java @@ -0,0 +1,36 @@ +package com.dreamlyn.dynamic.aspect; + +import com.dreamlyn.dynamic.DynamicDataSourceContextHolder; +import com.dreamlyn.dynamic.annotation.RoutingWith; +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.springframework.stereotype.Component; + +import java.lang.reflect.Method; + +/** + * 系统日志,切面处理类 + */ +@Aspect +@Component +public class RoutingAspect { + @Pointcut("@annotation(com.dreamlyn.dynamic.annotation.RoutingWith)") + public void routingPointCut() { + + } + + @Around("routingPointCut()") + public Object around(ProceedingJoinPoint point) throws Throwable { + MethodSignature signature = (MethodSignature) point.getSignature(); + Method method = signature.getMethod(); + RoutingWith routingWith = method.getAnnotation(RoutingWith.class); + if (routingWith != null) { + String key = routingWith.value(); + DynamicDataSourceContextHolder.setDataSource(key); + } + return point.proceed(); + } +} \ No newline at end of file diff --git a/src/test/java/com/dreamlyn/dynamic/DynamicApplicationTests.java b/src/test/java/com/dreamlyn/dynamic/DynamicApplicationTests.java index 83f44ef..65964d4 100644 --- a/src/test/java/com/dreamlyn/dynamic/DynamicApplicationTests.java +++ b/src/test/java/com/dreamlyn/dynamic/DynamicApplicationTests.java @@ -1,5 +1,6 @@ package com.dreamlyn.dynamic; +import com.dreamlyn.dynamic.annotation.RoutingWith; import com.dreamlyn.dynamic.entity.Menu; import com.dreamlyn.dynamic.entity.User; import com.dreamlyn.dynamic.mapper.MenuMapper; @@ -25,7 +26,7 @@ class DynamicApplicationTests { private UserMapper userMapper; @Test - void contextLoads() { + void dynamic() { //设置数据源 DynamicDataSourceContextHolder.setDataSource("master"); List users = userMapper.selectList(null); @@ -35,5 +36,4 @@ class DynamicApplicationTests { List menus = menuMapper.selectList(null); log.info("menu count:{}", menus.size()); } - }