`

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/

 

 

分享到:
评论

相关推荐

    后端 Java Spring Data Jpa @Transactional 介绍

    在Java后端开发中,Spring框架提供了强大的事务管理能力,特别是在使用Spring Data JPA时,`@Transactional`注解使得事务处理变得简单易用。这个注解是Spring框架中的核心部分,它允许开发者声明性地控制事务边界,...

    7. JPA - Hibernate【从零开始学Spring Boot】

    作为从零开始学习Spring Boot的一部分,理解如何有效地利用这些技术进行数据库操作至关重要。 首先,JPA是Java平台上的一个标准,用于管理关系数据库中的对象持久化。它为开发人员提供了一种统一的API,简化了...

    Spring3事务管理——使用@Transactional 注解.rar

    - `@Transactional`注解仅在Spring AOP代理能够拦截到的方法上生效,因此,如果在非Spring管理的类或静态方法中使用,事务管理将不起作用。 - 如果事务属性设置不当,可能会导致数据不一致或并发问题,应谨慎调整...

    Spring @Transactional工作原理详解

    在Spring框架中,`@Transactional`注解是一个强大的工具,用于声明式地管理事务。它使得开发者无需显式地在代码中控制事务的开始、提交和回滚,从而提高了代码的可读性和可维护性。下面我们将深入探讨`@...

    @Transactional实现原理.txt

    @Transactional实现原理.txt

    深入学习Spring Boot排查 @Transactional 引起的 NullPointerException问题

    深入学习Spring Boot排查 @Transactional 引起的 NullPointerException问题 在 Spring Boot 应用程序中,@Transactional 注解是非常常用的,它能够帮助我们管理事务,使得数据库操作更加可靠和安全。然而,在某些...

    springboot中事务管理@Transactional的注意事项与使用场景

    SpringBoot 中事务管理 @Transactional 的注意事项与使用场景 在本篇文章中,我们将详细讲解 SpringBoot 中事务管理 @Transactional 的注意事项与使用场景,以帮助开发者更好地理解和使用 @Transactional 注解。 ...

    Spring中@Transactional事务回滚(含实例

    `@Transactional`是Spring提供的一个注解,用于在方法级别或类级别定义事务属性,如事务的传播行为、隔离级别、读写模式以及超时设置。当一个方法被标记为`@Transactional`时,Spring会自动管理事务的开始、提交或...

    spring 自定义事务管理器,编程式事务,声明式事务@Transactional使用

    通过`transactional_learn`目录下的文件,你将能够逐步学习和实践以上所有内容,从配置Spring的事务管理到编写示例代码,最后运行并观察事务管理的效果。这将加深你对Spring事务管理的理解,帮助你在实际项目中更加...

    Spring声明式事务@Transactional知识点分享

    "Spring声明式事务@Transactional知识点分享" 在 Spring 框架中,@Transactional 注解是实现声明式事务的关键。通过 @Transactional 注解,可以指定事务的传播行为、隔离级别、读写控制等属性。 首先,@...

    spring常用注解

    10. @Transactional:定义方法或类为事务性,Spring会自动进行事务管理。 11. @PostConstruct和@PreDestroy:分别表示在Bean初始化后和销毁前执行的方法。 12. @Configuration:用于标记配置类,替代传统的XML配置...

    spring @Transactional 无效的解决方案

    "Spring @Transactional 无效的解决方案" Spring框架中的@Transactional注解是用来实现事务管理的,但是有时候我们可能会遇到@Transactional注解无效的情况。在这篇文章中,我们将 introducethe 解决方案,并通过...

    Spring Boot实战派(源码)

    《Spring Boot实战派》源码提供了丰富的学习材料,旨在帮助开发者深入理解并熟练掌握Spring Boot这一流行的Java后端开发框架。Spring Boot简化了Spring应用程序的初始设置和配置,使得开发人员能够快速构建可运行的...

    零基础认识 Spring Boot.docx

    零基础认识 Spring Boot Spring Boot 是一个基于 Spring 框架的开源框架,旨在简化 Spring 应用的开发过程。它提供了一种快速、灵活和高效的方式来构建生产级应用程序。 新建 Spring Boot 项目 使用 Spring ...

    Spring中的@Transactional事物回滚实例源码

    在Spring框架中,`@Transactional`注解是事务管理的核心组件,它允许开发者在方法级别声明事务边界。本文将深入探讨这个注解的工作原理、如何配置以及如何在遇到异常时触发事务回滚。 首先,`@Transactional`是...

    spring-@Transactional-jar

    spring事务管理注解jar,spring-tx-3.2.4.RELEASE.jar,导入项目即可

    SQL注入原理以及Spring Boot如何防止SQL注入(含详细示例代码)

    SQL注入是一种严重的安全威胁,它允许攻击者通过在应用程序的输入字段中插入恶意SQL代码来执行未经授权的数据库...Spring Boot通过提供JdbcTemplate和Spring Data JPA等工具,为开发者提供了防止SQL注入的有效手段。

    Spring @Transactional注解失效解决方案

    Spring @Transactional 注解失效解决方案 在 Spring 框架中,@Transactional 注解是用于管理事务的关键工具之一。但是,在实际开发中,我们经常会遇到 @Transactional 注解失效的问题。本篇文章将详细介绍 @...

    什么情况会导致@Transactional事务失效?

    13. **非Spring管理的对象**:如果一个类不是由Spring管理的,而是通过new关键字创建的,那么这个类的方法上的`@Transactional`注解将无效,因为Spring无法通过AOP代理来处理这些方法。 了解以上这些情况并避免它们...

    Java注解@Transactional事务类内调用不生效问题及解决办法

    Java注解@Transactional事务类内调用不生效问题及解决办法 Java注解@Transactional是Java中的一种注解,主要用于标记事务边界。然而,在某些情况下,@Transactional注解可能不会生效,例如在同一个类中的方法调用...

Global site tag (gtag.js) - Google Analytics