AOP常见的实现有:
等
AOP Alliance定义了AOP中的基础概念,但它并不是一种AOP的实现,它的目标为各种AOP实现提供统一的接口.Spring AOP, GUICE等都采用了AOP Alliance中定义的接口,因而需要依赖aopalliance.jar.
Spring AOP使用XML配置文件的方式定义切入点(CutPoint),Aspectj使用注解方式
Spring AOP使用JDK Proxy或者cglib实现代理类生成。对于有实现接口的类使用JDK Proxy,对于无接口的则是用cglib.通过
<aop:aspectj-autoproxy proxy-target-class="true"/>
指定proxy-target-class为true可强制使用cglib.
JDK Proxy只适用于类实现了接口的情况,关系图:
Interface ----------> OriginClass |---------> ProxyClass
生成的代理类实现了原类的接口,但和原类没有继承关系.
cglib则是生成原来的子类,对于没有实现接口的情况也适用:
OriginClass --------> ProxyClass
cglib采用字节码生成的方式来在代理类中调用原类方法, JDK Proxy 则是使用反射调用,由于反射存在额外security check 的开销一集目前jvm jit对反射的内联支持不够好,JDK Proxy在性能上弱于cglib
因为Spring AOP XML配置文件定义的方式太繁琐遭到吐槽,所以spring从Aspectj中吸收了其注解定义的方式。然而其实现依然是动态代理的方式,与aspectj 字节码织入的方式不同。
确切的说,应该只需要aspectjweaver.jar, aspectjrt.jar是aspectjweaver.jar的子集。Spring-aspects 实现类似aspectj注解方式的时候,借用了aspectjweaver.jar中定义的一些annotation和class,然而其并不使用Aspectj的字节码织入功能。
他们可以,但是他们偏不这样做