设计模式-代理模式

@Data
public class Order {
private Object orderInfo;
private Integer userId;
}


public interface IOrderDao {
int insert(Order order);

}

public class OrderDaoImpl implements IOrderDao {
@Override
public int insert(Order order) {
System.out.println("Dao层添加Order成功");
return 1;
}
}
public interface IOrderService {
int saveOrder(Order order);
}

public class OrderServiceImpl implements IOrderService {
private IOrderDao iOrderDao;

@Override
public int saveOrder(Order order) {

iOrderDao = new OrderDaoImpl();
System.out.println("Service层调用Dao层添加Order");
return iOrderDao.insert(order);
}
}

public class DataSourceContextHolder {
private static final ThreadLocal<String> CONTEXT_HOLDER = new ThreadLocal<String>();

public static void setDBType(String dbType){
CONTEXT_HOLDER.set(dbType);
}
public static String getDBType(){
return (String)CONTEXT_HOLDER.get();
}
public static void clearDBType()
{
CONTEXT_HOLDER.remove();

}


}

public class OrderServiceDynamicProxy implements InvocationHandler {


private Object target;

public OrderServiceDynamicProxy(Object target) {
this.target = target;
}

public Object bind(){
Class cls = target.getClass();
return Proxy.newProxyInstance(cls.getClassLoader(),cls.getInterfaces(),this);
}

@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
Object argObject = args[0];
beforeMethod(argObject);
Object object = method.invoke(target,args);
afterMethod();
return object;
}

private void beforeMethod(Object obj){
int userId = 0;
System.out.println("动态代理 before code");
if(obj instanceof Order){
Order order = (Order)obj;
userId = order.getUserId();
}
int dbRouter = userId % 2;
System.out.println("动态代理分配到【db"+dbRouter+"】处理数据");

//todo 设置dataSource;
DataSourceContextHolder.setDBType("db"+String.valueOf(dbRouter));
}

private void afterMethod(){
System.out.println("动态代理 after code");
}
}

省略了继承
AbstractRoutingDataSource
posted @ 2019-07-01 22:51  payzulla  阅读(92)  评论(0编辑  收藏  举报