public class Order { private Object orderInfo; private Long createTime; private String id; public Object getOrderInfo() { return orderInfo; } public void setOrderInfo(Object orderInfo) { this.orderInfo = orderInfo; } 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; } }建立 OrderDao 持久層操作類。
public class OrderDao { public int insert(Order order) { System.out.println("OrderDao建立Order成功"); return 1; } }建立 IOrderService 介面。
public interface IOrderService { int createOrder(Order order); }建立 OrderService 實現類。
public class OrderService implements IOrderService { private OrderDao orderDao; public OrderService() { //如果使用Spring,這裡應該是自動注入的 //為了使用方便,我們在構造方法中直接將orderDao初始化 orderDao = new OrderDao(); } @Override public int createOrder(Order order) { System.out.println("OrderService呼叫orderDao建立訂單"); return orderDao.insert(order); } }
//動態切換資料來源 public class DynamicDataSourceEntry { //預設資料來源 public final static String DEFAULT_SOURCE = null; private final static ThreadLocal<String> local = new ThreadLocal<String>(); private DynamicDataSourceEntry() { } //清空資料來源 public static void clear() { local.remove(); } //獲取當前正在使用的資料來源名字 public static String get() { return local.get(); } //還原當前切換的資料來源 public static void restore() { local.set(DEFAULT_SOURCE); } //設定已知名字的資料來源 public static void set(String source) { local.set(source); } //根據年份動態設定資料來源 public static void set(int year) { local.set("DB_" + year); } }建立切換資料來源的代理類 OrderServiceStaticProxy。
import java.text.SimpleDateFormat; import java.util.Date; public class OrderServiceStaticProxy implements IOrderService { private SimpleDateFormat yearFormat = new SimpleDateFormat("yyyy"); private IOrderService orderService; public OrderServiceStaticProxy(IOrderService orderService) { this.orderService = orderService; } public int createOrder(Order order) { before(); Long time = order.getCreateTime(); Integer dbRouter = Integer.valueOf(yearFormat.format(new Date(time))); System.out.println("靜態代理類自動分配到【DB_" + dbRouter + "】資料來源處理資料"); DynamicDataSourceEntry.set(dbRouter); orderService.createOrder(order); after(); return 0; } public void before() { System.out.println("代理模式之前的方法"); } public void after() { System.out.println("代理模式之後的方法"); } }DbRouteProxyTest 類測試程式碼如下。
public class DbRouteProxyTest { public static void main(String[] args) { try { Order order = new Order(); SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); Date date = sdf.parse("2018/01/01"); order.setCreateTime(date.getTime()); IOrderService orderService = new OrderServiceStaticProxy(new OrderService()); orderService.createOrder(order); } catch (ParseException e) { e.printStackTrace(); } } }執行結果如下所示:
代理模式之前的方法
靜態代理類自動分配到【DB_2018】資料來源處理資料
OrderService呼叫orderDao建立訂單
OrderDao建立Order成功
代理模式之後的方法