代理(1)
什么是代理?
代理模式是指给某一个对象提供一个代理对象,并由代理对象控制对原对象的引用。通俗的来讲代理模式就是我们生活中常见的中介。这种模式有什么用呢?它可以在原对象的基础上增强原对象的功能,比如在原对象调用一个方法的前后进行日志、事务操作等。Spring AOP就使用了代理模式。
了解代理入口:
静态代理:
如何实现代理模式呢?首先来看静态代理。静态代理是指在程序运行前就已经存在的编译好的代理类是为静态代理。
实现静态代理有四个步骤:
①定义业务接口;
public interface IA { void f1(String param); }
②被代理类实现业务接口;
public class A implements IA { @Override public void f1(String param) { System.out.println("方法f1执行了........" + param); } }
③定义代理类并实现业务接口;
public class Aproxy implements IA { /** * @Description 被代理对象 */ private IA target; /*** * @Author * @Description 通过构造方法传入被代理对象 * @Date 15:39 2019/1/10 * @Param [target] * @return */ public Aproxy(IA target) { this.target = target; } @Override public void f1(String param) { System.out.println("被代理对象方法执行前执行.........."); target.f1(param); System.out.println("被代理对象方法执行后执行.........."); } }
④最后便可通过客户端进行调用。(这里可以理解成程序的main方法里的内容)
public class StaticProxyTest { public static void main(String[] args) { IA ia = new A(); Aproxy aproxy = new Aproxy(ia); aproxy.f1("ceshi"); } }
静态代理的缺点(以此衍生出动态代理):
①代理类和被代理类实现了相同的接口,导致代码的重复,如果接口增加一个方法,那么除了被代理类需要实现这个方法外,代理类也要实现这个方法,增加了代码维护的难度。
②代理对象只服务于一种类型的对象,如果要服务多类型的对象。势必要为每一种对象都进行代理,静态代理在程序规模稍大时就无法胜任了。比如上面的例子,只是对用户的业务功能(IUserService)进行代理,如果是商品(IItemService)的业务功能那就无法代理,需要去编写商品服务的代理类。
于是乎,动态代理的出现就能帮助我们解决静态代理的不足。所谓动态代理是指:在程序运行期间根据需要动态创建代理类及其实例来完成具体的功能。