解决的问题:动态的控制数据源。这个请求可能要查数据库甲,下一个请求可能要查数据库乙。
涉及到的知识点:spring的AbstractRoutingDataSource,mybatis的getConnection,ThreadLocal,spring-aop
纯粹是一个demo,用于笔者的学习记录:
目录截图:
//mapper类
public interface UserMapper {
User select(int id);
}
//实体类
public class User {
private int id;
private String name;
private String sex;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//Service类使用mapper
@Service("servicer")
public class Servicer{
@Autowired
private UserMapper userMapper;
public User getUser(int id,String flag){
return userMapper.select(id);
}
}
//Test类
public class Test {
public static void main(String[] args) {
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("testroutingdatasource/spring.xml");
Servicer servicer = (Servicer) context.getBean("servicer");
User user = servicer.getUser(2,"one");
System.out.println(user.getName());
User u = servicer.getUser(1,"two");
}
}
重要的类:
//切面类,在哪些方法执行之前切换数据源
@Aspect
@Component
public class AspectDataSource {
@Pointcut("execution(* testroutingdatasource.servicer.Servicer.*(..))")
public void pointcut(){}
@Before("pointcut()