proxy-target-class之坑

来源:互联网 发布:支付宝源码 编辑:程序博客网 时间:2024/06/10 06:27

SSM框架配置实物时,会开始事务注解,如下所示:

<!-- 决定事务注解是否生效,去掉后@Transactional 注解不报错但不生效 -->
        <tx:annotation-driven transaction-manager="transactionManager" order="200" proxy-target-class="true"/>

proxy-target-class属性值默认是false,该属性值决定是基于接口类还是基于实现类的代理被创建。

如果proxy-target-class 属性值被设置为true,那么基于实现类的代理将起作用(这时需要cglib库)。

如果proxy-target-class属值被设置为false或者这个属性被省略,那么标准的JDK 基于接口的代理将起作用。即使你未声明 proxy-target-class="true" ,但运行类没有继承接

口,spring也会自动使用CGLIB代理(高版本spring自动根据运行类选择 JDK 或 CGLIB 代理)

默认情况下,我们会在接口实现类加上@service注解以及进行事务注解的声明(全局声明或方法上声明都可),这种做法提供接口类服务供rpc调用是没问题的,客户端只需引入相应的jar包,spring中配置bean,使用时@Resource或@Autowired注解注入都可以。

如果是接口类的方法上使用@Transaction注解,那么spring配置bean之后,注入的时候导致程序编译不通过,部分报错信息如下:

Caused by: java.lang.IllegalArgumentException: Cannot subclass final class class com.sun.proxy.$Proxy110at org.springframework.cglib.proxy.Enhancer.generateClass(Enhancer.java:446)at org.springframework.cglib.transform.TransformingClassGenerator.generateClass(TransformingClassGenerator.java:33)at org.springframework.cglib.core.DefaultGeneratorStrategy.generate(DefaultGeneratorStrategy.java:25)at org.springframework.cglib.core.AbstractClassGenerator.create(AbstractClassGenerator.java:216)at org.springframework.cglib.proxy.Enhancer.createHelper(Enhancer.java:377)at org.springframework.cglib.proxy.Enhancer.create(Enhancer.java:285)at org.springframework.aop.framework.CglibAopProxy.getProxy(CglibAopProxy.java:205)
解决办法:接口类去掉注解或者proxy-target-class设置false

阅读全文
0 0
原创粉丝点击