代理模式是经常使用的Java 设计模式,它的特征是代理类与委托类有一样的接口,代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及过后处理消息等。代理类与委托类之间一般会存在关联关系,一个代理类的对象与一个委托类的对象关联,代理类的对象自己并不真正实现服务,而是经过调用委托类的对象的相关方法,来提供特定的服务。按照代理类的建立时期,代理类可分为两种。
静态代理类:
由程序员建立或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。动态代理类:在程序运行时,运用反射机制动态建立而成。
因而可知,静态代理类能够为委托类预处理消息、把消息转发给委托类和过后处理消息等。 也就是委托模式。
动态代理类
与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不只简化了编程工做,并且提升了软件系统的可扩展性,由于Java 反射机制能够生成任意类型的动态代理类。java.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。
Spring中的AOP便是代理模式的一种框架级使用
Spring中有使用三种技术实现功能代理;
1.Java动态代理
2.CGlib
3.Aspectj
Spring AOP模式
默认模式
默认Spring使用java动态代理与CGlib混合的代理方式提供服务,即若对象类实现了接口则Spring自动采用java动态代理进行支持,不然采用CGlib进行支持;这中间隐含的是对效率的选择,cglib的效率要略低于java自带动态代理;
固然也能够强制指定使用cglib来进行代理,方法是在xml中配置<aop:aspectj-autoproxy proxy-target-class=”true” />进行开启;
使用Spring AOP默认模式的优势是使用简单,不须要LTW(load-time weave)支持,但其缺点是存在自调用方法没法织入的问题(self-invocation issue);
如:类C有方法A,B,
class C{
publich void A(){
System.out.println("A");
B();
}
publich void B(){
System.out.println("B");
}
}
若对C类全部方法代理在进入时均输出X
public X{
@Around("execution(* *(..))") java
说的比较苦涩,附件有更详细的代码能够试运行下就明白了 程序员
代码下载:http://vdisk.weibo.com/s/mYJmX
spring