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 是需要精心考虑的,以避免反射成为整个应用的瓶颈。