论坛首页 Java企业应用论坛

基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。

浏览 25448 次
该帖已经被评为精华帖
作者 正文
   发表时间:2012-03-08  
讲得很清楚,学习
0 请登录后投票
   发表时间:2012-03-08  
icezx 写道
简单一句话,jdk动态代理代理的对象必须有接口,而cglib是否有接口都可以进行代理,spring默认使用jdk代理。



把@Transactional 放在具体类/具体方法 而不是接口 

@Transactional是不继承的,,Spring文档也写的很清楚,我只是分析了一下为什么
0 请登录后投票
   发表时间:2012-03-08  
jinnianshilongnian 写道
icezx 写道
简单一句话,jdk动态代理代理的对象必须有接口,而cglib是否有接口都可以进行代理,spring默认使用jdk代理。



把@Transactional 放在具体类/具体方法 而不是接口 

@Transactional是不继承的,,Spring文档也写的很清楚,我只是分析了一下为什么


用jdk代理跟@Transactional是不是继承的没关系,你代理的service类有接口才是关键,spring才会采取默认的jdk动态代里(这里应该是采取jdk原生的动态代里性能会更好,当然你可以强制他使用cglib)。至于把注解打在接口上还是打在具体实现类上能达到事物控制的目的就看spring怎么实现了。

以上说法或许不够严谨,仅凭我使用过spring的一些记忆。有错误勿喷。呵呵
0 请登录后投票
   发表时间:2012-03-08  
icezx 写道
jinnianshilongnian 写道
icezx 写道
简单一句话,jdk动态代理代理的对象必须有接口,而cglib是否有接口都可以进行代理,spring默认使用jdk代理。



把@Transactional 放在具体类/具体方法 而不是接口 

@Transactional是不继承的,,Spring文档也写的很清楚,我只是分析了一下为什么


用jdk代理跟@Transactional是不是继承的没关系,你代理的service类有接口才是关键,spring才会采取默认的jdk动态代里(这里应该是采取jdk原生的动态代里性能会更好,当然你可以强制他使用cglib)。至于把注解打在接口上还是打在具体实现类上能达到事物控制的目的就看spring怎么实现了。

以上说法或许不够严谨,仅凭我使用过spring的一些记忆。有错误勿喷。呵呵


1、用jdk代理跟@Transactional是不是继承的没关系,你代理的service类有接口才是关键 是的

2、至于把注解打在接口上还是打在具体实现类上能达到事物控制的目的就看spring怎么实现了 是的,目前spring在对cglib方式 只能识别具体类上的,所以不管是jdk动态代理/cglib代理 我们都放在具体类上就没有问题
0 请登录后投票
   发表时间:2012-03-08  
icezx 写道
jinnianshilongnian 写道
icezx 写道
简单一句话,jdk动态代理代理的对象必须有接口,而cglib是否有接口都可以进行代理,spring默认使用jdk代理。



把@Transactional 放在具体类/具体方法 而不是接口 

@Transactional是不继承的,,Spring文档也写的很清楚,我只是分析了一下为什么


用jdk代理跟@Transactional是不是继承的没关系,你代理的service类有接口才是关键,spring才会采取默认的jdk动态代里(这里应该是采取jdk原生的动态代里性能会更好,当然你可以强制他使用cglib)。至于把注解打在接口上还是打在具体实现类上能达到事物控制的目的就看spring怎么实现了。

以上说法或许不够严谨,仅凭我使用过spring的一些记忆。有错误勿喷。呵呵


此处我只是分析了一下为什么,如果spring把 getAnnotation换成findAnnotation 即使cglib方式 放在接口也能找到
0 请登录后投票
   发表时间:2012-03-08  
虽然看不懂LZ再说什么,但是感觉很牛B的样子
0 请登录后投票
   发表时间:2012-03-08  
区别就在于两种代理实现的代理机制不一样。jdk动态代理是对接口动态生成代理类,将切面植入代理类中,而cglib代理是动态构建字节码文件生成目标类的子类,将切面加到子类中。让spring使用cglib代理实现事务时,把注解放在接口上肯定是不行的呀!对接口又不能生成子类!
0 请登录后投票
   发表时间:2012-03-09  
jinnianshilongnian 写道
osacar 写道
说的挺明白的。
+1


我在该公司是不用这个的,但如果用 一定要放到具体类 这样就没问题了

此前我也试过一次,spring+hibernate配置的。我事务注解放在接囗上就编译都过不了,放到实现类中就全OK。有空翻一下代码来看看。我现在的事务都放在接囗上
0 请登录后投票
   发表时间:2012-03-09  
xiangdefei 写道
区别就在于两种代理实现的代理机制不一样。jdk动态代理是对接口动态生成代理类,将切面植入代理类中,而cglib代理是动态构建字节码文件生成目标类的子类,将切面加到子类中。让spring使用cglib代理实现事务时,把注解放在接口上肯定是不行的呀!对接口又不能生成子类!



话说是这样,,但如果spring把 getAnnotation换成findAnnotation 即使cglib方式 放在接口也能找到
0 请登录后投票
   发表时间:2012-10-22  
@Transactiona 加在具体的方法上面不起作用,加在实现类上才起作用,这是怎么回事?郁闷啊。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics