什么是代理模式?
- 在某些情况下,一个客户类不能或者不想直接访问某个对象,而通过代理类对象就可以在客户类和委托对象之间起到中介的作用。
- 代理模式分为静态代理和动态代理
- 静态代理需要自己手动创建代理类,代理类和委托对象的关系在运行前就已经确定了。
- 动态代理在实现的时候不需要关系委托对象,运行的时候才指定具体委托对象。
- 动态代理的实现方式。
- JDK动态代理(Java自带的动态代理),需要实现 InvocationHandler接口。
- cglib 是第三方动态代理框架 。
- 静态代理具体实现:
- 静态代理模式
-
/**
* 代理模式-委托接口
*/
public interface OrderService {
void order();
}
--------------------------------------------------------------------------------------
/**
* 代理模式-委托类
*/
public class OrderServiceImpl implements OrderService {
@Override
public void order() {
System.out.println("正在生成订单");
}
}
/**
* 代理模式-代理类
*/
public class OrderProxy implements OrderService {
private OrderService orderService;
public OrderProxy(OrderService orderService){
this.orderService=orderService;
}
@Override
public void order() {
System.out.println("生成订单之前");
orderService.order();
System.out.println("生成订单之后");
}
}
public class ClientTest {
public static void main(String[] args) {
//静态代理
OrderProxy orderProxy=new OrderProxy(new OrderServiceImpl());
orderProxy.order();
}
}
- 动态代理模式
- JDK实现动态代理
-
/**
* 动态代理-JDK动态代理
*/
public class JDKHandlerProxy implements InvocationHandler {
public Object target;
public JDKHandlerProxy(Object target){
this.target=target;
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(">>>日志收集开始>>>>");
Object invoke = method.invoke(target, args);
System.out.println(">>>日志收集结束>>>>");
return invoke;
}
public <T> T getProxy(){
return (T)Proxy.newProxyInstance(target.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
}
public class ClientTest {
public static void main(String[] args) {
//动态代理—JDK动态代理
JDKHandlerProxy jdkHandlerProxy=new JDKHandlerProxy(new OrderServiceImpl());
OrderService proxy = jdkHandlerProxy.getProxy();
proxy.order();
}
}
-
- cglib实现动态代理
-
/* cglib实现动态代理,使用之前需要引入maven依赖
*/
public class CglibMethodInterceptor implements MethodInterceptor {
@Override
public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
System.out.println(">>>日志收集开始>>>>");
Object o1 = methodProxy.invokeSuper(o, objects);
System.out.println(">>>日志收集结束>>>>");
return o1;
}
}
public class ClientTest {
public static void main(String[] args) {
//动态代理-cglib动态代理
CglibMethodInterceptor cglibMethodInterceptor=new CglibMethodInterceptor();
Enhancer enhancer=new Enhancer();
enhancer.setSuperclass(OrderServiceImpl.class);
enhancer.setCallback(cglibMethodInterceptor);
OrderService o =(OrderService) enhancer.create();
o.order();
}
}
-------------------------------------------------------------------------本文内容参考蚂蚁课堂精讲设计模式系列
-