概述
- JDK 动态代理只能代理实现了接口的类;
动态代理代码
import designpattern.structural.proxy.Order;
import designpattern.structural.proxy.db.DataSourceContextHolder;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
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");
}
}
public class Test {
public static void main(String[] args) {
Order order = new Order();
// order.setUserId(2);
order.setUserId(1);
IOrderService orderServiceDynamicProxy =
(IOrderService)
new OrderServiceDynamicProxy(new OrderServiceImpl())
.bind();
orderServiceDynamicProxy.saveOrder(order);
}
}
输出:
动态代理 before code
动态代理分配到【db1】处理数据
Service层调用Dao层添加Order
Dao层添加Order成功
动态代理 after code