首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

Spring 中的署理

2013-04-22 
Spring 中的代理Spring中有两种方式进行Bean的代理:1。JDK 动态代理JDK主要通过Proxy.newProxyInstance(Cla

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();    }}



热点排行