代理模式
说到动态代理和静态代理,我们不得不说的就是代理模式,那么代理模式是什么呢?它是一种常用的设计模式,属于结构型。
代理模式的目的就是为其他对象提供一个代理以控制对某个对象的访问。
为了让代理类能使用委托类的方法名就能实现功能,让访问者用起来没有区别,都需要让代理类和委托类实现同一接口,能有效控制对
委托类对象的直接访问,也可以很好地隐藏和保护委托类对象。
静态代理
静态代理是事先知道委托类的对象类型。
具体实现类,委托类
1 | public class Man implements User { |
代理类
1 | public class UserProxy implements User { |
测试类
1 | public class Test { |
静态代理有很大的限制,因为每个委托类都有不同的功能,也就是说有不同的接口,而让代理类要代理这些类,要么类上面写
很多接口,要么就是创建很多不同的代理类。这就增加了很多复杂性,并且代码重复很多。
动态代理
静态代理中我们知道了如果要代理很多不同的类,静态是不可用的。所以动态代理出现了。
动态代理使用反射的原理来解决问题的。需要用到java.lang.reflect.InvocationHandler接口和 java.lang.reflect.Proxy 类。
具体实现类,委托类
1 | public class Man implements User { |
代理类
1 | public class UserProxy implements InvocationHandler { |
1 | public class Test { |
不过使用反射效率小,且很耗资源,所以一般都使用第三方库CGLib来实现,spring的aop原理就是使用反射加
上CGLib来实现的。