手动实现SPring中的AOP(1)

Spring中的AOP是基于JDK的API动态的在内存中创建代理对象的。所以这里先介绍一些设计模式之----代理模式:

a)         代理模式的定义:代理(Proxy)模式是一种提供对目标对象另外访问方式的设计模式;即客户端通过代理对象访问目标对象.这样做的好处是:可以在目标对象实现的基础上,增强额外的功能操作,实现对目标对象功能的扩展。

 

 

RealSubject相当于是目标对象,这就是客户端实际要操作的对象;

ProxySubject相当于是代理对象;

Subject是目标对象和代理对象的抽象接口,该接口中存放的是两者相同的方法。要想使用静态代理或者动态代理,就必须保证目标对象和代理对象都实现了相同的接口。

b)         代理模式的实现方式:

  • 静态代理:使用静态代理的大致过程就是:先创建一个接口里边包含目标对象的方法,然后目标对象和代理对象都要实现这个接口,这样在客户端使用的时候就可以调用相同的方法来实现对目标对象方法的调用,做到对用户是透明的。

 

  • 动态代理:动态代理中代理对象不需要实现和目标对象一样的接口(目标对象还是要实现接口的,否则不能代理),并且代理对象的生成是根据JDK中的API动态的在内存中构建代理对象(我们需要指明将要创建的代理对象/目标对象的接口类型)。所以动态代理也叫做JDK代理或者接口代理。

  • Cglib代理:上面的静态代理和动态代理模式都是要求目标对象是实现一个接口的目标对象,但是有时候目标对象只是一个单独的对象,并没有实现任何的接口,这个时候就可以使用以目标对象子类的方式来实现代理,这种方法就叫做:Cglib代理。

c)         三者的区别和比较:

  • 静态代理一般使用的比较少,主要是因为在这种方法中代理对象和目标对象需要实现相同的方法,如果目标方法实现的接口比较多,那么就会导致一个目标对象有多个代理对象;如果接口中的方法有改动代理对象和目标对象的代码都需要改动,不符合开闭原则。
  • 动态代理能够使用JDK中的API在内存中动态生成代理对象,并且代理对象不需要实现和目标对象一样的接口(目标对象需要实现接口),但是在动态生成代理对象的时候还是需要知道目标对象的接口类型。
  • Cglib方法是通过在内存中创建目标对象的子类对象的方式动态实现对目标功能的扩展,目标对象不需要实现接口,在Spring的AOP编程中:如果加入容器的目标对象有实现接口,用JDK代理;如果目标对象没有实现接口,用Cglib代理。
posted @ 2019-08-19 10:46  包子的百草园  阅读(267)  评论(0编辑  收藏  举报