代理 是结构型 通过继承,或者实现相同的接口来进行增强和监控
经典的使用 spring aop,mybatis dao层
作用:可以增加功能 而不破坏现有代码结构,一定程度的解耦
/***
* 卖房子
*/
public interface Sell {
void sellHouse();
}
public class PersonSell implements Sell{
@Override
public void sellHouse() {
System.out.println("我卖房子---");
}
}
public class ProxySell implements Sell{
private Sell sell;
public ProxySell(Sell sell) {
this.sell = sell;
}
@Override
public void sellHouse() {
System.out.println("中介联系人");
sell.sellHouse();
System.out.println("中介促成交易");
}
}
public static void main(String[] args) {
PersonSell personSell = new PersonSell();
ProxySell proxySell = new ProxySell(personSell);
proxySell.sellHouse();
}
可以看到 调用代理人方法 最终代理人服务被代理的对象 进行了前后包夹 无死角环绕
return Proxy.newProxyInstance(sourceObject.getClass().getClassLoader(), sourceObject.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("-----------我开始代理啦------------");
method.invoke(sourceObject, args);
return proxy;
}
});
其实整个核心就是这样的 使用Proxy.newProxyInstance 传入类加载器 传入接口 新创建一个处理器 执行 method.invoke 方法 并返回代理对象
展开一下
public interface Sell2 {
void sellHouse();
}
public class PersonSell implements Sell2 {
@Override
public void sellHouse() {
System.out.println("我卖房子---");
}
}
public class DynamicSellProxy {
//这里就两步 1:用Proxy newProxyInstance 创建一个代理类 用 InvocationHandler 来执行 target的方法
public Object proxy(Object target){
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("----动态代理前置----");
method.invoke(target,args);
System.out.println("----动态代理后置----");
return proxy;
}
});
}
}
//测试
public static void main(String[] args) {
((Sell2) new DynamicSellProxy().proxy(new PersonSell())).sellHouse();
}
public class CGLIBSellProxy {
public Object getProxy(Object target){
Enhancer enhancer = new Enhancer();
//设置被代理的class
enhancer.setSuperclass(target.getClass());
enhancer.setCallback(new MethodInterceptor() {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println("--------cjlib 动态代理前置-------");
methodProxy.invokeSuper(o, objects);
System.out.println("------cjlib 动态代理后置---------");
return o;
}
});
return enhancer.create();
}
}
((PersonSell) (new CGLIBSellProxy().getProxy(new PersonSell()))).sellHouse();