SpringAOP之动态代理

前提

最近看到Spring-Aop(面向切面编程)的实现基于动态代理,特此记录学习一下。

什么是动态代理?

  • 代理:当目标对象无法直接访问,创建一个客户端和目标对象之间的中介,这个中介可以被称为代理。
  • 动态: 使用反射机制,在程序执行的时候,创建代理类对象。
    动态代理:在程序执行中,利用jdk的反射机制,创建代理类对象,并动态指定要代理的对象

动态代理的作用

  1. 在不改变已有代码的基础上,通过代理来横向拓展增强其他的功能;
    (A写好了一个功能,你可以使用,但是A的功能不满足你的要求,因此可以通过代理A的功能代码,而不用修改原有的代码进行增加)
  2. 当目标类不允许直接访问(a类实现功能调用c类,但c类不允许a调用),因此可以创建代理b,让a访问b,b再访问c;
  3. 减少重复的代码;
  4. 专注业务逻辑代码;
  5. 解耦,让业务代码与非业务代码分离。

实现代理的方式?

1.静态代理

特点:

  • 代理类需要自己手动创建
  • 被代理的目标类是确定的

缺点:

  • 当需要被代理的目标类增加时,代理类也会成倍增加
  • 当接口中功能增加或者修改,对代理类、被代理类都会造成影响

2.动态代理

方式1:jdk动态代理
具体:基于java.lang.reflect的三个类:

  • invocationHandler
  • Method
  • Proxy

要求:目标类是一个实现接口类,必须实现某个接口
方式2:cglib动态代理
要求:目标类能被继承,即class和method不能是final

3.具体实现步骤

jdk动态代理实现步骤:

  1. 创建接口,定义目标类要实现的方法(功能)
  2. 创建目标类实现接口
  3. 创建InvocationHandler接口的实现类(代理类),重写invoke方法,在方法中完成需要代理的功能;
  4. 利用Proxy类创建代理对象------>newProxyInstance
  5. 类加载器实现接口给代理对象
  6. 利用代理对象调用目标类方法,自动调用invoke方法,使功能增强。

你可能感兴趣的:(java,spring,代理模式)