Spring的Proxy兑现

Spring的Proxy实现

Spring的proxy类是通过JDK的Proxy类或者CGLIB实现的。

分别介绍下两种方式:

CGLIB是一个动态字节码生成库, 基于ASM。

原理是通过动态地修改class文件,创建需要的类。比如:现有classProxyCglib类, 有方法printCglib,需要为这个类创建代理则只要通过class文件得到Proxy类并且得到printCglib的位置,在此方法前加入 printHelloWorld,这样可以实现AOP功能。

JDK的Proxy类是在java.lang.reflect下, 此方法生成Proxy需要针对接口编程,通过接口实现Proxy效果。 缺陷:

  • Proxy 是面向接口的,所有使用 Proxy 的对象都必须定义一个接口,而且用这些对象的代码也必须是对接口编程的:Proxy 生成的对象是接口一致的而不是对象一致的:例子中 Proxy.newProxyInstance 生成的是实现 Account 接口的对象而不是 AccountImpl 的子类。这对于软件架构设计,尤其对于既有软件系统是有一定掣肘的。
  • Proxy 毕竟是通过反射实现的,必须在效率上付出代价:有实验数据表明,调用反射比一般的函数开销至少要大 10 倍。而且,从程序实现上可以看出,对 proxy class 的所有方法调用都要通过使用反射的 invoke 方法。因此,对于性能关键的应用,使用 proxy class 是需要精心考虑的,以避免反射成为整个应用的瓶颈。