添加注解支持

master
李亚楠 5 years ago
parent ba4a597b14
commit 018f73732b
  1. 6
      pom.xml
  2. 6
      src/main/java/com/dreamlyn/dynamic/DynamicApplication.java
  3. 34
      src/main/java/com/dreamlyn/dynamic/UseDynamicDatasource.java
  4. 17
      src/main/java/com/dreamlyn/dynamic/annotation/RoutingWith.java
  5. 36
      src/main/java/com/dreamlyn/dynamic/aspect/RoutingAspect.java
  6. 4
      src/test/java/com/dreamlyn/dynamic/DynamicApplicationTests.java

@ -29,7 +29,6 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jdbc</artifactId>
</dependency>
<!--mybatis-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
@ -39,7 +38,10 @@
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>

@ -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);

@ -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<Menu> menus = menuMapper.selectList(null);
log.info("menu count:{}", menus.size());
// List<User> users = userMapper.selectList(null);
// log.info("user count:{}", users.size());
}
}

@ -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";
}

@ -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();
}
}

@ -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<User> users = userMapper.selectList(null);
@ -35,5 +36,4 @@ class DynamicApplicationTests {
List<Menu> menus = menuMapper.selectList(null);
log.info("menu count:{}", menus.size());
}
}

Loading…
Cancel
Save