`

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

阅读更多

 

 

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

       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

 */

public interface IBaseTestService {

    public void sayHello();

}

 

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

package com.kfit.demo.test;

 

import javax.transaction.Transactional;

 

/**

 * 基本接口实现

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

 * @version v.0.1

 * @date 2016725下午10:21:41

 */

public class BaseTestService implements IBaseTestService{

 

    @Transactional

    public void sayHello() {

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

    }

}

 

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

package com.kfit.demo.test;

 

import org.springframework.stereotype.Service;

 

/**

 * 测试类;

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

 * @version v.0.1

 * @date 2016725下午10:23:11

 */

@Service

public class TestService extends BaseTestService{

   

}

 

测试类引用:

@Autowired

private TestService testService;

 

调用: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

 */

public interface TestService extends IBaseTestService{

   

}

 

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

package com.kfit.demo.test;

 

import org.springframework.stereotype.Service;

 

/**

 * 测试类;

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

 * @version v.0.1

 * @date 2016725下午10:23:11

 */

@Service

public class TestServiceImpl extends BaseTestService implements TestService{

   

}

 

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

 

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

#开启CGLIB动态代理模式

spring.aop.proxy-target-class=true

 

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

Spring Boot 系列博客】

à悟空学院:https://t.cn/Rg3fKJD

学院中有Spring Boot相关的课程!点击「阅读原文」进行查看!

SpringBoot视频:http://t.cn/A6ZagYTi

Spring Cloud视频:http://t.cn/A6ZagxSR

SpringBoot Shiro视频:http://t.cn/A6Zag7IV

SpringBoot交流平台:https://t.cn/R3QDhU0

SpringData和JPA视频:http://t.cn/A6Zad1OH

SpringSecurity5.0视频:http://t.cn/A6ZadMBe

Sharding-JDBC分库分表实战http://t.cn/A6ZarrqS

分布式事务解决方案「手写代码」:http://t.cn/A6ZaBnIr

 

 

网易云课堂视频最新更新

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

3、Spring Boot日志-log4j2

第十二章 Spring Boot 知识点2

1、spring boot 服务配置和部署

2、Spring Boot 定制URL匹配规则

 

 

历史章节

 

第一章 快速开始

1、Spring Boot之Hello World

2、Spring Boot之Hello World访问404

 

第二章 Spring Boot之JSON

1、spring boot返回json数据

2、Spring Boot完美使用FastJson解析JSON数据

 

第三章 Spring Boot热部署

1、Spring Boot热部署(springloader)

2、springboot + devtools(热部署)

 

第四章 Spring Boot数据库

1、Spring Boot JPA/Hibernate/Spring Data概念

2、Spring Boot JPA-Hibernate

3、Spring Boot Spring Data JPA介绍

4、Spring Boot JdbcTemplate

5、Spring Boot集成MyBatis

 

第五章 web开发

1、全局异常捕捉

2、配置server信息

3、spring boot使用thymeleaf

4、Spring Boot 使用freemarker

5、Spring Boot添加JSP支持

 

第六章 定时任务

1、Spring Boot定时任务

2、Spring Boot 定时任务升级篇(动态修改cron参数)

3、Spring Boot 定时任务升级篇(动态添加修改删除定时任务)

4、Spring Boot 定时任务升级篇(集群/分布式下的定时任务说明)

5、Spring Boot Quartz介绍

6、Spring Boot Quartz在Java Project中使用

7、Spring Boot 集成Quartz普通使用

8、Spring Boot 集成Quartz升级版

9、Spring Boot 集成Quartz二次升级版

10、Spring Boot 集成Quartz-Job如何自动注入Spring容器托管的对象

 

第七章 Spring Boot MyBatis升级篇

1、Spring Boot MyBatis升级篇-注解

2、Spring Boot MyBatis升级篇-注解-自增ID

3、Spring Boot MyBatis升级篇-注解-增删改查

4、Spring Boot MyBatis升级篇-注解-分页查询

5、Spring Boot MyBatis升级篇-注解-分页PageHelper不生效

6、Spring Boot MyBatis升级篇-注解- mybatic insert异常:BindingException: Parameter 'name' not found

7、Spring Boot MyBatis升级篇-注解- #和$符号特别篇

8、Spring Boot MyBatis升级篇-注解-@Result

9、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案一:<script>

10、Spring Boot MyBatis升级篇-注解-动态SQL(if test)-方案二:@Provider

11、Spring Boot MyBatis升级篇-注解-动态SQL-参数问题

12、Spring Boot MyBatis升级篇-注解-特别篇:@MapperScan和@Mapper

13、Spring Boot MyBatis升级篇-XML

14、Spring Boot MyBatis升级篇-XML-自增ID

15、Spring Boot MyBatis升级篇-XML-增删改查

16、Spring Boot MyBatis升级篇-XML-分页查询

17、Spring Boot MyBatis升级篇-XML-分页PageHelper不生效

18、Spring Boot MyBatis升级篇-XML-动态SQL(if test)

19、Spring Boot MyBatis升级篇-XML-注解-初尝试

20、Spring Boot MyBatis升级篇- pagehelper替换为pagehelper-spring-boot-starter

 

第八章 Spring Boot 知识点1

1、Spring Boot 拦截器HandlerInterceptor

2、Spring Boot启动加载数据CommandLineRunner

3、Spring Boot环境变量读取和属性对象的绑定

4、Spring Boot使用自定义的properties

5、Spring Boot使用自定义的properties

6、Spring Boot使用@SpringBootApplication

7、Spring Boot 监控和管理生产环境

 

第十章 Spring Boot 打包部署

1、Spring Boot打包部署((提供Linux的sh文件))

 

第十一章 Spring Boot 日志

1、spring boot日志—理论

2、Spring Boot日志-logback

 

3、Spring Boot日志-log4j2

 

更多查看博客: http://412887952-qq-com.iteye.com/

 

 

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics