spring proxyTargetClass 动态代理

今天做两个项目的集成,主项目单独跑没问题,子项目单独跑没问题,集成到一起就挂了。报错信息为:

PropertyAccessException 1: org.springframework.beans.TypeMismatchException: 
Failed to convert property value of type [$Proxy121] to required type 
[com.**.facilities.group.service.BaseFacilitiesGroupService] 
for property 'baseFacilitiesGroupService'; nested exception is java.lang.IllegalArgumentException: 
Cannot convert value of type [$Proxy121] to required type 
[com.**.facilities.group.service.BaseFacilitiesGroupService] 
for property 'baseFacilitiesGroupService': no matching editors or conversion strategy found

org.springframework.beans.factory.BeanCreationException: Error creating bean wit
h name 'baseFacilitiesGroupForVoService' defined in ServletContext resource [/WE
B-INF/classes/spring/facilities.xml]: Cannot resolve reference to bea
n 'baseFacilitiesService' while setting bean property 'baseFacilitiesService'; n
ested exception is org.springframework.beans.factory.BeanCreationException: Erro
r creating bean with name 'baseFacilitiesService' defined in ServletContext reso
urce [/WEB-INF/classes/spring/facilities.xml]: Cannot resolve referen
ce to bean 'baseFacilitiesServiceTarget' while setting bean property 'target'; n
ested exception is org.springframework.beans.factory.BeanCreationException: Erro
r creating bean with name 'baseFacilitiesServiceTarget' defined in ServletContex
t resource [/WEB-INF/spring/facilities.xml]: Error setting pr
operty values; nested exception is org.springframework.beans.PropertyBatchUpdate
Exception; nested PropertyAccessExceptions (1) are:

 从报错信息来看,是类注入的时候,类型不匹配。再看一下,service是经过了一层事务代理的。看了一下两个项目的配置,完全没有问题。配置文件如下:

 

    <bean id="baseFacilitiesGroupService" parent="baseTransactionProxy">
        <property name="target" ref="baseFacilitiesGroupServiceTarget"/>
    </bean>

    <bean id="baseFacilitiesGroupServiceTarget"
          class="com.**.BaseFacilitiesGroupService">
        <property name="baseFacilitiesGroupDao" ref="baseFacilitiesGroupDao"/>
    </bean>

	<!--事务管理代理-->
	<bean id="baseTransactionProxy"
		class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"
		abstract="true">
		<property name="transactionManager" ref="transactionManager" />
		<property name="proxyTargetClass">
			<value>true</value>
		</property>
		<property name="transactionAttributes">
			<props>
				<!--<prop key="**">PROPAGATION_REQUIRED,-Exception</prop>
				-->
				<prop key="insert*">PROPAGATION_REQUIRED,-Exception</prop>
			</props>
		</property>
	</bean>

 

从网上搜索错误说proxyTargetClass需要配置为true,我们也配置了。

参考:http://blog.chinaunix.net/u/20045/showart_1019030.html

 

后来听说主项目没有使用我们的配置方法。而是使用了:

 

 

<bean id="chainService" 
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
        <property name="target">
            <ref bean="chainServiceTarget"/>
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="create*">
                    PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED
                </prop>
        </property>
    </bean>

 根据这种方式修改后,还是不work,后来想到,感觉是不是应该吧proxyTargetClass=true也配置上,加上之后,果然work了。

   <bean id="chainService" 
        class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
  <property name="proxyTargetClass">
   <value>true</value>
  </property>
        <property name="transactionManager">
            <ref bean="transactionManager"/>
        </property>
        <property name="target">
            <ref bean="chainServiceTarget"/>
        </property>
        <property name="transactionAttributes">
            <props>
                <prop key="create*">
                    PROPAGATION_REQUIRED, ISOLATION_READ_COMMITTED
                </prop>
            </props>
        </property>
    </bean>

 

再后来看到了如下的文章:ProxyFactoryBean什么时候需要配置 proxyTargetClass

 

说是spring动态代理使用cglib的时候会通过类所实现的接口动态代理生成类。这下去看那个报错的类,他实现了接口,但是其他地方使用的时候却是直接使用了这个类。所以动态代理生成的类,是会产生类型不匹配的问题。所以问题找到。

 

但是仍然有遗留的问题:

1.为什么子项目单独是可以运行的?

2.为什么我们最后配置完之后,其实就是将parent取掉,然后把代理的配置移到了本身上面,这两种方式我认为是没有区别的。为啥一个可以work,一个不行。

 

有谁可以解答一下,谢谢。

 

【SpringAOP】Spring AOP 底层逻辑:切点表达式与原理简明阐述 /定义自己的注解@Target 标识了 Annotation 所修饰的对象范围, 即该注解可以在什么地.@Retention 指Annotation被保留的时间短, 标明注解的命周期spring AOP原理,是要从源码进行解读的,但是源码过于复杂,最终的情况就是如下所示:在源码中的代理有个重要的属性: proxyTargetClass, 默认值为false. 也可以通过程序设置(这里的默认值是根据不同情况来进行定义的) 阅读详情

相关推荐

Blender到Unreal Engine高效资产迁移:Datasmith插件工作流详解

在3D内容创作与实时渲染领域,数字资产的无损迁移是连接创意设计与最终呈现的关键环节。其核心原理在于通过高保真的数据转换管道,替代传统离散的导出-导入流程,从而保留完整的场景层级、材质属性和关联信息。这项技术的核心价值在于极大提升了跨平台工作流的效率与数据保真度,减少了因格式转换导致的信息丢失和调试成本。它广泛应用于建筑可视化、产品设计、影视预演和游戏开发等场景,使艺术家能在专业DCC工具中专注创作,并一键同步至实时引擎进行交互式渲染与逻辑构建。本文聚焦于实现这一流程的**Datasmith**插件,并深入解

weixin_34110970的博客 268

spring的proxy-target-class详解

proxy-target-class属性值决定是基于接口的还是基于类的代理被创建。首先说明下proxy-target-class="true"和proxy-target-class="false"的区别,为true则是基于类的代理将起作用(需要cglib库),为false或者省略这个属性,则标准的JDK 基于接口的代理将起作用。 proxy-target-class在spring事务、aop、缓

shaoweijava的博客 5万+

ads传统功放设计笔记(3)

传统功放设计的流程一般包括以下这些步骤: 1、明确设计目标 2、选择功放管子 3、确定静态工作点 4、设计偏置电路 5、判断稳定性 6、负载与源牵引 7、输入输出阻抗匹配 8、原理图优化 9、大信号仿真 10、版图设计 11、版图联合仿真 12、pcb设计 第二节我们设计仿真了功放的原理图。之后我们需要对版图进行设计和仿真。 10、版图设计 首先将S参数控件都打叉,还要去掉电源、源负载阻抗、地、芯片、电容。在原先电容和芯片的位置加上gap,设置好长度和间隔。之后在电源引脚、输入输出引脚和隔离的两端加上端口。

qq_40995480的博客 6027

Spring-AOP

AOP 入口 通过扫描注解@EnableAspectJAutoProxy(proxyTargetClass = true,exposeProxy = true)注册了AOP 入口类,具体看看注解里面的 @Import(AspectJAutoProxyRegistrar.class) proxyTargetClass true 1、目标对象实现了接口– 使用CGLIB 代理机制 2、目标对象没有接...

Andy_Health的博客 1229

避开内存陷阱:手把手教你用RKNN零拷贝接口正确管理输入输出Tensor

本文深入解析RKNN零拷贝接口在边缘计算中的高效内存管理策略,通过YOLOX实例演示如何避免内存对齐错误和数据错位。详细介绍了`rknn_tensor_mem`系列API的正确使用方法,包括内存创建、绑定、释放全流程,以及性能优化技巧如内存池技术和多核NPU负载均衡,帮助开发者提升推理效率并避开常见陷阱。

weixin_33686714的博客 160

药物重定位实战:如何用反向找靶技术挖掘老药新用(附Python代码示例)

本文详细介绍了药物重定位中的反向找靶技术,通过分子相似性计算、机器学习模型和结构对接等方法,挖掘已有药物的新治疗潜力。附Python代码示例,帮助读者快速实现从分子结构到潜在靶标的智能预测,显著提升药物研发效率。

weixin_28726671的博客 259

SpringBoot中修改proxyTargetClass,但事务代理始终为CGLIB

一、配置 在Springboot中,开启事务特别简单,如下 1.在启动类上或者配置类上增加@EnableTransactionManagement 2.在需要开启事务的方法上增加@Transactional 二、问题 因为本人有个特别不好的习惯,经常把@Transactional注解使用在interface的方法上,最近遇到一个问题,事务不回滚。但在排查问题时debug发现,开...

laoxilaoxi_的博客 6564

3D打印切片软件Cura及CuraEngine原理分析

引言         年初开始进入3D打印行业,受命以Cura为基础,研发一款自主的3D打印切片软件。         自主研发要取其长处,补其不足,首先自然是要搞清楚Cura到底做了什么,读Cura的代码是必需的。我一向都觉得比起自己写代码来,读别人的代码是一个漫又而痛苦的过程,读者的思想与写者总有偏差,往往又无法验证自己的猜想是否正确,只叹人脑不是电脑,无法把眼前的代码从头到尾执行一遍...

AiDiShengDeXiaoWu的博客 4421

spring proxy-target-class

结论proxy-target-class=”true”,使用CGLIB代理 proxy-target-class=”false”,使用JDK代理,默认是JDK代理使用场景spring的代理模式有两种,JDK和CGLIB jdk对应目标类有接口的情况; cglib对应目标类没有接口,是普通类的情况;配置applicationContext.xml <context:component-s

wangjun5159的专栏 1288

【一文读懂】卫星轨道的轨道参数(六根数)和位置速度矢量转换及其在终端距离、相对速度和多普勒频移计算中的应用

本文首先介绍了卫星轨道的六根数参数:半长轴 a、偏心率 e、轨道倾角 i、升交点赤经 Ω、近地点幅角 ω 以及真近点角 ν,并探讨了如何利用这些参数计算卫星与地面终端之间的距离、相对速度及由此产生的多普勒频移。利用开普勒运动公式计算当前瞬间的轨道半径;根据真近点角 ν 在围心坐标系中计算位置矢量和速度矢量;利用旋转矩阵(依次旋转 ω、i、Ω)将围心坐标系的状态矢量转换到地心惯性坐标系;最终结合地面终端信息,计算卫星与终端的欧氏距离、沿视线的相对速度及多普勒频移。

u011376987的博客 9498

SPICE框架:自博弈提升大语言模型推理能力

自博弈训练是提升大语言模型推理能力的前沿技术,其核心思想是通过模型自我对话实现持续迭代优化。SPICE框架创新性地采用文档驱动的自博弈机制,结合思维链提示和迭代式上下文扩展,显著提升模型在数学证明、逻辑推理等复杂任务中的表现。该技术在代码生成、金融分析等工程场景中展现出23%-41%的性能提升,其关键技术包括多样性控制、质量过滤和记忆管理。随着与RLAIF等强化学习方法的结合,这种训练范式正在推动大模型向更接近人类思维方式的推理能力进化。

weixin_28686771的博客 402

从JDK动态代理到CGLIB:Spring事务@EnableTransactionManagement中proxyTargetClass参数的真实影响

本文深入解析Spring事务管理中`@EnableTransactionManagement`的`proxyTargetClass`参数对JDK动态代理和CGLIB代理选择的影响。通过对比两种代理技术的实现差异、运行时行为及性能表现,揭示该参数在事务管理中的实际作用,并提供生产环境下的配置建议和优化策略,帮助开发者避免常见陷阱。

weixin_42529366的博客 404

YOLOv12涨点优化:自研检测头 | 独家创新(Partial_C_v12Detect)检测头结构创新,实现涨点

现有12Detect进行二次创新,提升检测精度,独家创新(Partial_C_12Detect)检测头结构创新,适合科研创新度十足,强烈推荐

①答疑群聊服务;②YOLO大模型知识问答系统;③计算机视觉论文生成智能体; 632

详解Spring AOP篇三

详解代理模式,静态代理,JDK动态代理,CGLIB动态代理以及Spring AOP源码解析。

. 8875

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Spring AOP 代理模式:CGLIB 与 JDK 动态代理区别

在讲区别之前,我们先明确一个核心概念:Spring AOP 的本质是「动态代理」,简单来说,就是 Spring 会在运行时,动态生成一个「代理对象」,这个代理对象会包裹住目标对象(我们的业务对象),当我们调用目标对象的方法时,实际上是先调用代理对象的方法,代理对象在方法执行前后,插入增强逻辑(如日志、限流),最后再执行目标对象的核心业务逻辑。CGLIB 代理的核心是「面向继承」,代理对象是目标对象的「子类」,通过重写目标方法实现增强,无需目标对象实现接口,但目标方法不能是 final 修饰。

。。。 905

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

若依框架中@EnableAspectJAutoProxy注解配置proxyTargetClass为false失效问题

EnableAspectJAutoProxy(exposeProxy = true,proxyTargetClass=false),其中proxyTargetClass=false后,service实现类仍然使用的cglib代理的。AspectJAutoProxyRegistrar中的registerBeanDefinitions进入断点两次,第一次proxyTargetClass=false,第二次为true,第二次覆盖了第一次的值,我猜想第一次是我配置的,第二次应该有自动配置类默认是true.

曾令胜的博客 999

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Spring选择哪种方式代理?

如果类已经实现了接口,就用 jdk 的动态代理即可,如果没有实现接口,就需要用子类的形式,采用 cglib 动态代理。:JDK 动态代理使用java.lang.reflect.Proxy类和相关的InvocationHandler接口来创建代理对象。:CGLIB 代理适用于没有实现接口的类,或者需要代理类中的所有方法(包括那些没有在接口中定义的方法)。:CGLIB 代理使用字节码生成技术,在运行时生成目标类的子类,并在子类中拦截方法调用。好的,面试官,动态代理的方式主要是。:代理对象是目标对象实现的。

埃泽漫笔 1万+

SpringAOP(面向切面编程)和动态代理的总结

1、AOP概念: 主要功能:日志记录 2、AOP特点: 采用横向抽取机制,取代了传统纵向继承体系重复性代码。 3、AOP底层实现: AOP底层使用动态代理实现。包括两种方式: 使用JDK动态代理实现。 使用cglib来实现 jdk和cglib的区别: 只能对实现了接口的类生成代理,而不是针对类,该目标类型实现的接口都将被代理。 JDK动态代理实现: 原理是通过在运行期间创...

songkai558919的博客 994

Spring源码 之 AOP动态代理源码分析——基础篇

决定使用cglib还是jdk由于JdkDynamicAopProxy和ObjenesisCglibAopProxy都实现了AopProxy,所以刚才getProxy方法调用的时候使用哪种实现是在这里返回不同的实现类决定的。

wenyixicodedog的博客 454

SpringAOP原理

Spring AOP中的代理模式实现,包括静态代理和动态代理两种方式。静态代理需预先编写代理类,灵活性较差;动态代理分为JDK动态代理(基于接口)和CGLIB动态代理(基于继承)。文章详细解析了两种动态代理的实现原理、核心API及使用场景,并比较了它们的优缺点。最后说明了Spring AOP如何根据目标对象特征(是否有接口)和配置(proxyTargetClass属性)自动选择代理方式认

2402_82938245的博客 707

【Spring Boot】Spring AOP动态代理,以及静态代理

定义 MethodInterceptor 并重写 intercept 方法, intercept 于增强标方法,和JDK动态代理中的 invoke 方法类似//?标对象, 即被代理对象@Override// 代理增强内容System.out.println("我是中介, 开始代理");//通过反射调?被代理类的方法//代理增强内容System.out.println("我是中介, 代理结束");

2509_92390300的博客 683

深入Spring AOP底层——JDK、CGLIB动态代理

代理模式就是为其它对象提供一种代理以控制对这个对象的访问,它的作用就是通过一个代理类间接调用目标方法,并且在间接调用的过程中还可以对目标方法进行功能增强。打个比方:你可以想象,你想要租房,中介(代理)会帮你联系房东(目标对象),同时中介还会负责和你签订合同,代房东将房屋出租给你(如果这是一个黑中介,可能还会想你索取各种费用),那么在上面的过程中:(1)中介代房东将房屋出租给你,就属于间接调用(本质是房东出租给你)(2)黑中介向你索取各种费用,就属于功能增强了。

zhakakqns的博客 948

Spring AOP

Spring AOP是一种面向切面编程的思想,通过代理对象在运行期对方法进行增强。它解决了业务代码中横切关注点(如日志、事务等)分散的问题,使业务代码只关注核心逻辑。本文通过手动实现JDK动态代理的方式,展示了AOP的核心原理:创建代理对象拦截方法调用,在方法执行前后插入统一逻辑。关键点包括:代理对象必须基于接口、工厂返回的是代理而非真实对象、通过InvocationHandler实现方法拦截。这种机制实现了业务逻辑与横切关注点的解耦,为理解Spring AOP奠定了基础。

lingyuxiaobai的博客 1063

jdk源码分析书籍 pdf_什么?Spring5 AOP 默认使用Cglib?从现象到源码深度分析

推荐阅读:阿里工作十年拿下P8,多亏了这些PDF陪我成长(Spring全家桶+源码解析+Redis实战等)​zhuanlan.zhihu.com从入门到熟悉,一步一步带你了解 MySQL 中的「索引」和「锁」​zhuanlan.zhihu.comSpring5 AOP 默认使用 Cglib 了?我第一次听到这个说法是在一个微信群里:真的假的?查阅文档刚看到这个说法的时候,我是保持怀疑态度的。大家都...

weixin_39560029的博客 131

Spring AOP原理

AOP是面向切面编程,是一种思想-------对一类特定问题的统一处理就。比如Spring实现了AOP这种思想。

huapiaoy的博客 937
上一篇: spring事务无异常回滚 [spring rollback without exception]
下一篇: cxf spring 发布 webservice 供 .net使用
xiaoxinphp
博客等级 码龄18年 1粉丝 45原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值