关闭

67. @Transactional的类注入失败

223人阅读 评论(0) 收藏 举报
分类:

【从零开始学习SpirngBoot—常见异常汇总】

       spring的代理模式有两种:Java自带的动态代理模式和cglib代理模式,cglib代码模式适用于没有接口的类,而java自带适用于接口类,默认情况下spring boot或者spring 采用接口类的代理模式,如果我们是基于接口编程的,是不会发生问题的,但是如果我们定义了一个class类继承Base类的时候就会出问题了。如下代码就会出现问题:

基本接口类com.kfit.demo.test.IBaseTestService:

package com.kfit.demo.test;

 

/**

 *定义基本接口类;

 *@author Angel(QQ:412887952QQ交流群:193341332)

 *@version v.0.1

 *@date 2016725下午10:20:45

 */

publicinterface IBaseTestService{

    publicvoid sayHello();

}

 

基本接口实现com.kfit.demo.test.BaseTestService:

package com.kfit.demo.test;

 

importjavax.transaction.Transactional;

 

/**

 *基本接口实现

 *@author Angel(QQ:412887952QQ交流群:193341332)

 *@version v.0.1

 *@date 2016725下午10:21:41

 */

publicclass BaseTestService implementsIBaseTestService{

 

    @Transactional

    publicvoid sayHello() {

       System.out.println("BaseTestService.sayHello()");

    }

}

 

测试服务类com.kfit.demo.test.TestService:

package com.kfit.demo.test;

 

importorg.springframework.stereotype.Service;

 

/**

 *测试类;

 *@author Angel(QQ:412887952QQ交流群:193341332)

 *@version v.0.1

 *@date 2016725下午10:23:11

 */

@Service

publicclass TestService extends BaseTestService{

   

}

 

测试类引用:

@Autowired

privateTestServicetestService;

 

调用:testService.sayHello();

 

执行以上我们编写的代码,是会抛出异常的,无法找到TestService实体类。

       那么这个就是由于Spring Boot默认使用了Java自带的动态代理模式(接口代理)。

我们要怎么修改呢?有两种方案遵循接口模式编程:

第一种方案:将上面的TestService修改为接口,然后添加一个TestService的实现类。代码如下:

com.kfit.demo.test.TestService 修改为接口,代码如下:

package com.kfit.demo.test;

 

/**

 *测试类;

 *@author Angel(QQ:412887952QQ交流群:193341332)

 *@version v.0.1

 *@date 2016725下午10:23:11

 */

publicinterface TestService extendsIBaseTestService{

   

}

 

TestService接口的实现类com.kfit.demo.test.TestServiceImpl:

package com.kfit.demo.test;

 

importorg.springframework.stereotype.Service;

 

/**

 *测试类;

 *@author Angel(QQ:412887952QQ交流群:193341332)

 *@version v.0.1

 *@date 2016725下午10:23:11

 */

@Service

publicclass TestServiceImpl extends BaseTestServiceimplements TestService{

   

}

 

在运行测试代码,完美运行。

 

第二种方法就是修改SpringBoot的默认动态代理模式,我们刚才说了默认的是Java的动态代理模式,我们只需要修改为CGLIB动态代码模式即可,只需要在application.properties加入如下配置:

#开启CGLIB动态代理模式

spring.aop.proxy-target-class=true

重新运行测试代码,也可完美运行。

0
0
查看评论

67. @Transactional的类注入失败

【从零开始学习SpirngBoot—常见异常汇总】        Spring的代理模式有两种:java自带的动态代理模式和cglib代理模式,cglib代码模式适用于没有接口的类,而java自带适用于接口类,默认情况下spring boo...
  • linxingliang
  • linxingliang
  • 2016-09-17 23:29
  • 1189

Spring源码分析--@Autowired注入的不是代理对象,导致事务回滚失败(@Transactional无效)

@Autowired注入的不是代理对象,导致事务回滚失败(@Transactional无效)结论:不要在@Configuration类中的@Bean中直接注入需要成为代理对象的对象问题分析我们都知道Spring的事务控制是使用AOP实现的,所以@Autowired注入的对象必须是一个代理对象(类似:...
  • tragedyxd
  • tragedyxd
  • 2017-02-13 16:57
  • 1679

67. @Transactional的类注入失败【从零开始学Spring Boot】

【从零开始学习Spirng Boot—常见异常汇总】        Spring的代理模式有两种:java自带的动态代理模式和cglib代理模式,cglib代码模式适用于没有接口的类,而java自带适用于接口类,默认情况下spring b...
  • gebitan505
  • gebitan505
  • 2017-02-15 15:34
  • 347

关于service中添加Transaction注解后,service无法注入bean

当在service中添加上Transaction注解后,我在测试代码中无法获取改service的bean实例 @Override@Transactionalpublic void userPurch(String username,String bid){//获取书的单价double price =...
  • xiaolu991954992
  • xiaolu991954992
  • 2017-04-08 12:49
  • 954

spring中的@Transactional注解使用注意点

@Transactional可以说是spring中最常用的注解之一了,通常情况下我们在需要对一个service方法添加事务时,加上这个注解,如果发生unchecked exception,就会发生rollback,最典型的例子如下。@Service public class StudentServi...
  • u013815546
  • u013815546
  • 2017-02-14 16:51
  • 1991

常用注解@Transactional

概要: 1、@Transactional类完全限定名:org.springframework.transaction.annotation.Transactional;   2、Spring中的@Transactional基于动态代理的机制,提供了一种透明的事务管理机制,方便...
  • cs2425244259
  • cs2425244259
  • 2016-01-12 17:23
  • 4913

Spring中的@Transactional 放在 类级别 和 方法级别 上有什么不同?

Spring中的@Transactional 放在类级别 和 方法级别 上有什么不同? @Transactional放在类级别上是否等同于该类的每个方法都放上了@Transactional? 是的 一般类上这么写 //默认将类中的所有函数纳入事务管理. @Transactional(re...
  • loadhai
  • loadhai
  • 2014-02-07 13:46
  • 9626

关于配置事务时的spring service注入问题

今天写代码时遇到一个问题,给AService配置事务后运行报错:Unsatisfied dependency expressed through field 'aService': Bean named 'aService' is expected to be of ...
  • xyc_csdn
  • xyc_csdn
  • 2017-04-12 20:15
  • 750

添加@Transactional后获取不到类前的注解

原本在类前加了一个自定义的注解,后来在该类下的方法中添加了@Transactional注解,发现通过类反射获取不到自定义的注解了。 原因是增加了Transactional会增加AOP代理,IOC中的bean是代理类,不是真实bean需要通过代理获取真实的的类。Advised advised = (...
  • u011403655
  • u011403655
  • 2016-08-20 09:38
  • 283

@Transactional事务几点注意

这里面有几点需要大家留意: A. 一个功能是否要事务,必须纳入设计、编码考虑。不能仅仅完成了基本功能就ok。 B. 如果加了事务,必须做好开发环境测试(测试环境也尽量触发异常、测试回滚),确保事务生效。 C. 以下列了事务使用过程的注意事项,请大家留意。 1. 不要在接口上声明@Transa...
  • KinseyGeek
  • KinseyGeek
  • 2017-02-08 19:36
  • 10429
    个人资料
    • 访问:80154次
    • 积分:1517
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:388篇
    • 译文:0篇
    • 评论:11条
    最新评论