代理

代理模式

代理类与委托类有相同接口,代理类负责为委托类过滤消息、预处理消息、消息传给委托类、事后处理消息。代理类对象并不真正实现服务,只是调用委托类对象的相关方法,来提供服务。

方式

静态代理:程序运行前代理类代码已经存在

动态代理:运行时利用反射机制创建而成

 

JDK动态代理

java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。可通过InvocationHandler接口定义横切逻辑,并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑 编织在一起。

proxy利用InvocationHandler动态创建一个符合某一接口的实例,生成目标类的代理对象。

CGLib动态代理

为一个类创建子类,在子类中采用方法拦截的技术拦截所有父类的调用,并顺势织入横切逻辑。但因为采用的是继承,所以不能对final修饰的类进行代理。 

JDK动态代理所创建的代理对象,在JDK 1.3下,性能强差人意。虽然在高版本的JDK中,动态代理对象的性能得到了很大的提高,但是有研究表明,CGLib所创建的动态代理对象的性能依旧比JDK的所创建的代理对象的性能高不少(大概10倍)。但CGLib在创建代理对象时所花费的时间却比JDK动态代理多(大概8倍),所以对于singleton的代理对象或者具有实例池的代理,因为无须频繁创建代理对象,所以比较适合用CGLib动态代理技术,反之适合用JDK动态代理技术。值得一提的是,由于CGLib采用动态创建子类的方式生成代理对象,所以不能对目标类中的final方法进行代理。

 

posted @ 2017-07-04 13:08  山下有佳人  阅读(135)  评论(0)    收藏  举报