Spring AOP 问与答
2016-04-05 15:26
274 查看
Spring AOP
Aspectj
Guice AOP
Jboss AOP
等
Aspectj 使用编译期字节码织入(weave)的方式,在编译的时候,直接修改类的字节码,把所定义的切面代码逻辑插入到目标类中。
Spring AOP可以对其它模块正常编译出的代码起作用,Aspectj 需要对其它模块使用acj重新编译
Spring AOP对于直接调用类内部的其它方法无效(需要获取对应的代理类来吊用),无法对定义为final的类生效(因为无法撑撑代理类,导致运行时异常)。Aspectj没有这些限制
Spring AOP使用XML配置文件的方式定义切入点(CutPoint),Aspectj使用注解方式
注: Aspectj 除了编译期静态织入的方式之外,也支持加载时动态织入修改类的字节码。
指定proxy-target-class为true可强制使用cglib.
生成的代理类实现了原类的接口,但和原类没有继承关系.
cglib则是生成原来的子类,对于没有实现接口的情况也适用:
cglib采用字节码生成的方式来在代理类中调用原类方法, JDK Proxy 则是使用反射调用,由于反射存在额外security check 的开销一集目前jvm jit对反射的内联支持不够好,JDK Proxy在性能上弱于cglib
Spring AOP 问与答
2016-04-03AOP的实现有哪些
AOP常见的实现有:Spring AOP
Aspectj
Guice AOP
Jboss AOP
等
AOP Alliance 是什么, 为什么Spring AOP需要aopalliance.jar?
AOP Alliance定义了AOP中的基础概念,但它并不是一种AOP的实现,它的目标为各种AOP实现提供统一的接口.Spring AOP, GUICE等都采用了AOP Alliance中定义的接口,因而需要依赖aopalliance.jar.Spring AOP 和 Aspectj的区别?
Spring AOP采用动态代理的方式,在运行期生成代理类来实现AOP,不修改原类的实现.Aspectj 使用编译期字节码织入(weave)的方式,在编译的时候,直接修改类的字节码,把所定义的切面代码逻辑插入到目标类中。
Spring AOP可以对其它模块正常编译出的代码起作用,Aspectj 需要对其它模块使用acj重新编译
Spring AOP对于直接调用类内部的其它方法无效(需要获取对应的代理类来吊用),无法对定义为final的类生效(因为无法撑撑代理类,导致运行时异常)。Aspectj没有这些限制
Spring AOP使用XML配置文件的方式定义切入点(CutPoint),Aspectj使用注解方式
注: Aspectj 除了编译期静态织入的方式之外,也支持加载时动态织入修改类的字节码。
Spring AOP的代理类如何实现的?
Spring AOP使用JDK Proxy或者cglib实现代理类生成。对于有实现接口的类使用JDK Proxy,对于无接口的则是用cglib.通过<aop:aspectj-autoproxy proxy-target-class="true"/>
指定proxy-target-class为true可强制使用cglib.
JDK Proxy 和 cglib什么区别?
JDK Proxy只适用于类实现了接口的情况,关系图:Interface ----------> OriginClass |---------> ProxyClass
生成的代理类实现了原类的接口,但和原类没有继承关系.
cglib则是生成原来的子类,对于没有实现接口的情况也适用:
OriginClass --------> ProxyClass
cglib采用字节码生成的方式来在代理类中调用原类方法, JDK Proxy 则是使用反射调用,由于反射存在额外security check 的开销一集目前jvm jit对反射的内联支持不够好,JDK Proxy在性能上弱于cglib
Spring-aspects 又是什么鬼
因为Spring AOP XML配置文件定义的方式太繁琐遭到吐槽,所以spring从Aspectj中吸收了其注解定义的方式。然而其实现依然是动态代理的方式,与aspectj 字节码织入的方式不同。为什么spring-aspects还需要aspectjrt.jar和aspectjweaver.jar才能工作
确切的说,应该只需要aspectjweaver.jar, aspectjrt.jar是aspectjweaver.jar的子集。Spring-aspects 实现类似aspectj注解方式的时候,借用了aspectjweaver.jar中定义的一些annotation和class,然而其并不使用Aspectj的字节码织入功能。Spring-aspects不能把这些所需的类定义抄一份吗,这样就不需要aspectjweaver.jar了
他们可以,但是他们偏不这样做相关文章推荐
- 设计模式-策略模式 java实现
- Java基础-二维和三维数组
- Font "楷体_GB2312" is not available to the JVM. See the Javadoc for more det
- eclipse、Myeclipse中批量增加、删除注释--技巧方法小结
- Ubuntu JAVA安装与配置
- Java反射整理
- Java并发编程:Timer和TimerTask
- Java反射整理
- Java6开发WebService入门
- JAVA同步容器和并发容器
- 修改eclipse/MyEclipse中修改包的显示结构
- javaweb 简单 de 登录注册
- java日期加减操作
- Java实现栈结构详细代码
- <context:annotation-config> vs <context:component-scan> 的区别
- JAVA实现KNN分类
- java中处理数据精度丢失
- Java NIO系列教程(七) FileChannel
- java是单继承的
- 排序算法分析(JAVA)