代理(Proxy)是一种设计模式,提供了对目标对象另外的访问方式;即通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,即扩展目标对象的功能.
这里使用到编程中的一个思想:不要随意去修改别人已经写好的代码或者方法,如果需改修改,可以通过代理的方式来扩展该方法.
举个例子来说明代理的作用: 假设我们想邀请一位明星,那么并不是直接连接明星,而是联系明星的经纪人,来达到同样的目的.明星就是一个目标对象,他只要负责活动中的节目,而其他琐碎的事情就交给他的代理人(经纪人)来解决.这就是代理思想在现实中的一个例子.
- 1. 静态代理
- 可以做到在不修改目标对象的功能前提下,对目标功能扩展.
- 因为代理对象需要与目标对象实现一样的接口,所以会有很多代理类,类太多.同时,一旦接口增加方法,目标对象与代理对象都要维护.
-
如何解决静态代理中的缺点呢?答案是可以使用动态代理方式
- 2. 动态代理
- 代理对象不需要实现接口,但是目标对象一定要实现接口,否则不能用动态代理
- 3. Cglib代理
- 1. 需要引入cglib的jar文件,但是Spring的核心包中已经包括了Cglib功能,所以直接引入spring-core-3.2.5.jar即可.
- 2. 引入功能包后,就可以在内存中动态构建子类
- 3. 代理的类不能为final,否则报错
- 4. 目标对象的方法如果为final/static,那么就不会被拦截,即不会执行目标对象额外的业务方法.