关闭

67. @Transactional的类注入失败

176人阅读 评论(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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:57750次
    • 积分:1246
    • 等级:
    • 排名:千里之外
    • 原创:8篇
    • 转载:379篇
    • 译文:0篇
    • 评论:9条
    最新评论