最近看公司的轮子,发现一个 api服务动态代理。于是打算详细看一下代理模式。动态代理很重要,很多框架底层都是基于它实现的。
代理模式及其变体分为很多种:有远程代理、虚拟代理、保护代理,变体有缓存代理、同步代理、防火墙代理和写入时复制代理。
代理的步骤一般分为:
1)代理对象和真实对象建立代理关系
2) 实现代理对象的代理逻辑方法
1. JDK动态代理:
Java内置的代理支持,可以根据需要建立动态代理,并将所有调用分配到所选的处理器。
1 public interface HelloWorld { 2 public void sayHelloWorld(); 3 } 4 5 6 7 public class HelloWordImpl implements HelloWorld { 8 @Override 9 public void sayHelloWorld() { 10 System.out.println("Hello, World"); 11 } 12 } 13 14 15 16 public class JdkProxyExample implements InvocationHandler { 17 18 private Object target = null; //被代理的对象 19 20 public Object bind(Object target) { 21 this.target = target; 22 return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); 23 } 24 25 @Override 26 public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { 27 System.out.println("进入代理逻辑的方法"); 28 System.out.println("在调度真实对象之前的服务"); 29 Object obj = method.invoke(target, args); //相当于调sayHelloWorld方法 30 System.out.println("在调度真实对象之后的服务"); 31 return obj; 32 } 33 34 /** 35 * 制定代理的逻辑类 36 */ 37 public static void testJDKProxy() { 38 JdkProxyExample jdkProxy = new JdkProxyExample(); 39 HelloWorld proxy = (HelloWorld) jdkProxy.bind(new HelloWordImpl()); 40 proxy.sayHelloWorld(); 41 } 42 43 public static void main(String[] args) { 44 JdkProxyExample.testJDKProxy(); 45 } 46 }
2. 拦截器:
设计者往往会用拦截器代替动态代理提供给开发者使用,降低开发难度
拦截器的工作流程:
