Spring 中的代理
Spring中有两种方式进行Bean的代理:
1。JDK 动态代理
JDK主要通过Proxy.newProxyInstance(Classloader, Interface[], InvocationHandler)方法,生成一个与目标类实现相同接口的代理类,这也是为什么Spring中经常出现ClassCastException: $Proxy can not be cast to xxx. 因为生成的代理类并不是目标类的子类。
InvocationHandler接口主要包含一个invoke(Object, Method, Object[])方法。第一个参数为生成的代理类,第二个为要执行的方法,第三个为方法参数。
2。Cglib代理
JDK动态代理只能代理interface,对于没有实现任何接口的类,我们只能使用另一个Cglib代理。Cglib采用非常底层的字节码技术,可以为一个类创建子类。 Cglib的核心类是Enhancer, 它为目标类创建代理实例,并可以通过setCallBack设置回调类(CallBack),最常见的类为MethodInterceptor. 该类的主要方法为intercept(Object, Method, Object[], ProxyMethod)
interface
JDK代理-InvocationHandler
Cglib - 测试package cglib;import Impl.IPhone;public class TestCglibProxy {public static void main(String args[]){CglibProxy cgProxy = new CglibProxy();IPhone phone = new IPhone();//ApplicationContext context = new FileSystemXmlApplicationContext("/src/beans.xml");//// IPhone phone = (IPhone)context.getBean("iphone"); IPhone p = (IPhone)cgProxy.createProxy(phone.getClass()); p.speak(); }}