静态代理与动态代理

常见的代理模式是我们业务开发时候经常会用到的一种设计模式。代理模式给某一个目标对象提供一个代理对象,并由代理对象控制对原目标对象的引用,完成目标对象的方法,并且在目标对象方法的前后,进行逻辑的增强。通俗的来讲代理模式就是我们生活中常见的中介。

代理模式在业务开发中一般有静态代理和动态代理,下面举一个生活中的例子来说明静态代理与动态代理。

普通人person是一个接口,他有买东西和找工作两种功能


Person接口

目标类是son,他实现了Person接口,因此有了买东西和找工作的两个方法


Son目标对象

此时Son想找一个代理来帮助他更好的完成这两件事情。

首先是静态代理:


静态代理类


静态代理测试类

我们可以看到,静态代理将接口方法,目标对象都要写进去,并且提前就要声明要帮谁代理,所以如果此时不光son需要代理,girl,boy等等目标类都要求代理的话,需要写出各个目标对象一一对应的代理类,所以整体下来还是相当麻烦的。静态代理其实是在编译时就将接口、实现类、代理类一股脑儿全部手动完成。

为了弥补静态代理的不足,我们想只写一次,等真正运行时在判断哪个目标对象需要代理。这时候就需要动态代理了。动态代理分为JDK动态代理和CgLib动态代理。

先看JDK动态代理:


jdk动态代理类


jdk动态代理测试类

我们看到,JDK动态代理类首先需要实现InvocationHandler接口,然后完成invoke方法,也是代理逻辑增强的方法。JDK动态代理一开始并不确定谁是目标类,而是利用反射原理得到目标类的类加载器,接口,并且利用这些作为参数来生成代理对象,然后在测试时候才将目标类确认,作为参数传给代理实例。

JDK动态代理拥有局限性,那就是必须面向接口编程,没有接口就无法实现代理,我们也不可能为了代理而为每个需要实现代理的类强行添加毫无意义的接口,这时我们需要Cglib,这种依靠继承来实现动态代理的方式,不再要求我们必须要有接口。

CgLib动态代理:


CgLib动态代理类

CgLib动态代理要实现MethodInterceptor接口,他有一个方法intercept,其实是拦截的意思,也就是说业务逻辑的增强在这里进行。CgLib动态代理生成代理的方式是利用Enhancer增强类,并将目标类设置为enhancer的父类,以此来得到目标类的接口,方法信息等等。

你可能感兴趣的:(静态代理与动态代理)