Springboot 动态代理异常-because it is a JDK dynamic proxy that implements

本文主要是介绍Springboot 动态代理异常-because it is a JDK dynamic proxy that implements,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

用心编码:

雷军: 用互联网的方式做企业,要靠 “专注、极致、口碑、快” 这 “七字诀”!



今天在重构一套原有系统时,项目启动时,莫名其妙的报错了,错误如下图所示:
在这里插入图片描述

一、问题描述

***************************
APPLICATION FAILED TO START
***************************Description:The bean 'attachCacheService' could not be injected as a 'com.abc.service.AttachCacheService' because it is a JDK dynamic proxy that implements:Action:Consider injecting the bean as one of its interfaces or forcing the use of CGLib-based proxies by setting proxyTargetClass=true on @EnableAsync and/or @EnableCaching.Process finished with ex 类it code 1

错误的意思是:AttachCacheService 类采用的是 JDK动态代理的方式实现的,需要我们考虑使用基于CGLib方式实现动态代理。

二、代码分析

1.服务层(service)没有按照传统方式定义, 没有定义接口及实现。而是直接定义实现类,如下:

@Service
public class AttachCacheService{@Transactional(rollbackFor = Exception.class)public String upload(MultipartFile file) {// upload file...return "http://test.com/abcde.jpg";}
}

2.在网上查询这个错误时,我得到以下几种解决方案:

(1)在启动类上加上 @EnableTransactionManagement(proxyTargetClass = true)

(2)在配置文件配置 spring.aop.proxy-target-class=true

(3)按照传统方式定义 接口及实现类


三、深入理解Springboot 动态代理及CGLib

1.JDK动态代理

JDK动态代理:利用Java反射机制生成一个实现代理接口的匿名类,通过InvokeHandler来处理。

针对接口类生成代理。

2.CGLib动态代理

CGLib动态代理:利用开源asm包对代理对象类(class)文件动态加载,并且修改字节码数据实现动态代理。

针对类生成实现代理。

(1)若目标对象实现了接口(IService + ServiceImpl) ,那么Springboot 会采用JDK动态代理实现AOP

(2)如果目标对象没有实现接口(Service),那么必须采用CGLib 实现AOP


四、总结

1.重点是上面方法上加上了@Transactional(rollbackFor = Exception.class)注解,该注解的目标主要是用于控制数据库事务,那么它的内部必须通过AOP切面的方法去实现事务控制,所以会用到动态代理,而且是采用CGLib。

2.一般情况下 实现接口类,接口类采用JDK代理,实现类采用CGLib代理


3.Springboot2.x默认使用CGLib代理,官方如下解释:

This was changed in 1.4 (see 5423). We’ve generally found cglib proxies less likely to cause unexpected cast exceptions.

需要将 spring.aop.proxy-target-class属性值设置为true 调用cglib
在这里插入图片描述


4.当设置过 @EnableAsync和@EnableCaching 时,spring.aop.proxy-target-class 默认为false。


我的头条:
在这里插入图片描述

这篇关于Springboot 动态代理异常-because it is a JDK dynamic proxy that implements的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/734772

相关文章

Java使用MethodHandle来替代反射,提高性能问题

《Java使用MethodHandle来替代反射,提高性能问题》:本文主要介绍Java使用MethodHandle来替代反射,提高性能问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑... 目录一、认识MethodHandle1、简介2、使用方式3、与反射的区别二、示例1、基本使用2、(重要)

Java实现本地缓存的常用方案介绍

《Java实现本地缓存的常用方案介绍》本地缓存的代表技术主要有HashMap,GuavaCache,Caffeine和Encahche,这篇文章主要来和大家聊聊java利用这些技术分别实现本地缓存的方... 目录本地缓存实现方式HashMapConcurrentHashMapGuava CacheCaffe

SpringBoot整合Sa-Token实现RBAC权限模型的过程解析

《SpringBoot整合Sa-Token实现RBAC权限模型的过程解析》:本文主要介绍SpringBoot整合Sa-Token实现RBAC权限模型的过程解析,本文给大家介绍的非常详细,对大家的学... 目录前言一、基础概念1.1 RBAC模型核心概念1.2 Sa-Token核心功能1.3 环境准备二、表结

eclipse如何运行springboot项目

《eclipse如何运行springboot项目》:本文主要介绍eclipse如何运行springboot项目问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目js录当在eclipse启动spring boot项目时出现问题解决办法1.通过cmd命令行2.在ecl

Java中的Closeable接口及常见问题

《Java中的Closeable接口及常见问题》Closeable是Java中的一个标记接口,用于表示可以被关闭的对象,它定义了一个标准的方法来释放对象占用的系统资源,下面给大家介绍Java中的Clo... 目录1. Closeable接口概述2. 主要用途3. 实现类4. 使用方法5. 实现自定义Clos

Jvm sandbox mock机制的实践过程

《Jvmsandboxmock机制的实践过程》:本文主要介绍Jvmsandboxmock机制的实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、背景二、定义一个损坏的钟1、 Springboot工程中创建一个Clock类2、 添加一个Controller

SpringBoot实现文件记录日志及日志文件自动归档和压缩

《SpringBoot实现文件记录日志及日志文件自动归档和压缩》Logback是Java日志框架,通过Logger收集日志并经Appender输出至控制台、文件等,SpringBoot配置logbac... 目录1、什么是Logback2、SpringBoot实现文件记录日志,日志文件自动归档和压缩2.1、

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

spring-gateway filters添加自定义过滤器实现流程分析(可插拔)

《spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔)》:本文主要介绍spring-gatewayfilters添加自定义过滤器实现流程分析(可插拔),本文通过实例图... 目录需求背景需求拆解设计流程及作用域逻辑处理代码逻辑需求背景公司要求,通过公司网络代理访问的请求需要做请

Spring Security介绍及配置实现代码

《SpringSecurity介绍及配置实现代码》SpringSecurity是一个功能强大的Java安全框架,它提供了全面的安全认证(Authentication)和授权(Authorizatio... 目录简介Spring Security配置配置实现代码简介Spring Security是一个功能强