一 代码
1 DynamicDataSourcrEntry
package DataDynamicProxy;
public class DynamicDataSourcrEntry {
public final static String DEDAULT_SOURCE = null;
private final static ThreadLocal<String> local = new ThreadLocal<String>();
private DynamicDataSourcrEntry(){
}
public static void clear(){
local.remove();
}
public static String get(){
return local.get();
}
public static void restore(){
local.set(DEDAULT_SOURCE);
}
public static void set(String source){
local.set(source);
}
public static void set(int year){
local.set("DB_"+year);
}
}
2 IOrderService
package DataDynamicProxy;
public interface IOrderService {
int createOrder( Order order);
}
3 Order
package DataDynamicProxy;
public class Order {
private Object orderInfo;
private Long createTime;
private String id;
public Long getCreateTime() {
return createTime;
}
public void setCreateTime( Long createTime ) {
this.createTime = createTime;
}
public String getId() {
return id;
}
public void setId( String id ) {
this.id = id;
}
public Object getOrderInfo() {
return orderInfo;
}
public void setOrderInfo( Object orderInfo ) {
this.orderInfo = orderInfo;
}
}
4 OrderDao
package DataDynamicProxy;
public class OrderDao {
public int insert(Order order){
System.out.println("orderDao创建Order成功!");
return 1;
}
}
5 OrderService
package DataDynamicProxy;
public class OrderService implements IOrderService {
private OrderDao orderDao;
public OrderService(){
orderDao = new OrderDao();
}
public int createOrder(Order order){
System.out.println("orderService调用orderDao创建订单");
return orderDao.insert(order);
}
}
6 OrderServiceDynamicProxy
package DataDynamicProxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.text.SimpleDateFormat;
import java.util.Date;
public class OrderServiceDynamicProxy implements InvocationHandler{
private SimpleDateFormat yearFomat = new SimpleDateFormat("yyyy");
private Object target;
public Object getInstance(Object target){
this.target = target;
Class<?> clazz = target.getClass();
return Proxy.newProxyInstance(clazz.getClassLoader(),clazz.getInterfaces(),this);
}
public Object invoke( Object proxy, Method method, Object[] args ) throws Throwable{
before(args[0]);
Object object = method.invoke(target,args);
after();
return object;
}
private void before(Object target){
try {
System.out.println("Proxy before method.");
Long time=(Long)target.getClass().getMethod("getCreateTime").invoke(target);
Integer dbRoute = Integer.valueOf(yearFomat.format(new Date(time)));
System.out.println("静态代理类自动分配到【DB_"+dbRoute+"】数据源处理数据");
DynamicDataSourcrEntry.set(dbRoute);
} catch (Exception e) {
e.printStackTrace();
}
}
private void after(){
System.out.println("Proxy after method.");
}
}
7 Test
package DataDynamicProxy;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Test {
public static void main(String[] args){
try {
Order order = new Order();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
Date date=sdf.parse("2019/12/21");
order.setCreateTime(date.getTime());
IOrderService orderService = (IOrderService)new OrderServiceDynamicProxy().
getInstance(new OrderService());
orderService.createOrder(order);
} catch (Exception e) {
e.printStackTrace();
}
}
}
二 测试结果
Proxy before method.
静态代理类自动分配到【DB_2019】数据源处理数据
orderService调用orderDao创建订单
orderDao创建Order成功!
Proxy after method.
三 代码位置
https://gitee.com/cakin24/javatest/tree/master/src/main/java/DataDynamicProxy