一、什么是代理?
代理是一种设计模式,提供了对目标对象另外的访问方式,即通过代理对象访问目标对象。可以不修改目标对象,对目标对象功能进行拓展。在我们学习Spring的时候就会发现,AOP(面向切面编程)的底层就是代理。
代理的实现可以分为静态代理和动态代理。动态代理又根据实现的方式分为:基于JDK接口的动态实现和基于Cglib类的动态实现
为什么需要代理?
代理的目的是为了使被代理类的功能更加纯粹,不用考虑其他的问题,其他的一些操作都可以在代理类中完成。
在javaweb中就用一个典型的例子,我们可以将service层看做是dao层的代理,dao层需要专注于纯粹的数据库交互。
代理的好处
可以使真实角色的操作更加纯粹,不用关注一些公共的业务。
公共的业务直接交给代理角色,实现了业务的分工。
公共业务发生扩展时,可以集中操作。
什么是动态代理?
使用jdk的反射机制,创建对象的能力,创建的是代理类的对象。而不用你创建类文件。不用写java文件。
**动态:**在程序执行时,调用JDK提供的方法才能创建代理类的对象。
jdk动态代理,必须有接口,目标类必须实现接口,没有接口时,需要使用cylib动态代理。
核心类
增强类
测试类
Spring配置文件
interfaces:
一个Interface对象的数组,就是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了, 通俗的讲就是被代理类所实现的接口,而代理类也需要这个接口,否则它怎么知道你要用到哪个方法呢
一个InvocationHandler对象,就是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上,也就是需要怎么实现对被代理对象的加强。
InvocationHandler接口:
作用:内部写增强代码
内部的invoke()方法:
invoke()方法(调用):目标类中的接口方法都会经过该方法
此方法内部写对方法的增强部分
注意使用匿名内部类需要调用外部成员变量,外部成员变量要设置为final
proxy: 所代理的那个真实对象
method: 所要调用真实对象的某个方法的Method对象,通过method.invoke(目标类, 参数)来调用目标类中的方法。
args: 调用真实对象某个方法时接受的参数,为method.invoke()方法提供参数,参数就是目标类中被调用方法上需要的参数