1.静态代理
代理类实现和目标类相同的接口,并持有接口的引用,通过接口的引用在自己的内部调用目标类的方法
2.动态代理
1.JDK动态代理
通过JDK的Proxy类的静态方法newProxyIntance,可以在程序运行期间动态的生代理类
2.Cglib动态代理
需要引入Cglib.jar,不过spring-core中已经集成了此功能,所以不需要再额外引入jar包自定义一个代
理类实现MethodInterceptor接口,在invoke方法中可实现增强功能,调用时通过Enhancer类对其进行调用
代理模式的好处:
1.中介隔离的作用
在某些时候不能直接使用目标类或者不想直接使用目标类时,可以用代理的方式对目标类进行调用
2.开闭原则,增强功能
代理模式可以在代理类中对目标类的方法进行增强,添加缓存,日志等功能
总结:
因静态代理模式当接口每次改变时实现类都需要改变,并且当目标类因需求增加了方法时代理类也要做相应修改,维护
起来比较麻烦,故不推荐使用。
所以当目标类有实现接口时可以通过JDK动态代理实现代理模式,没有接口时可以用Cglib实现。