如何避免Spring 6中非致命的"TargetSource无法确定目标类"堆栈跟踪输出?
问题分析与结论
这属于Spring 6的行为变更,而非严重缺陷,但你的实现确实有可优化的空间来避免这条日志。
为什么Spring 6会输出这条日志?
Spring 6对DefaultListableBeanFactory中FactoryBean的异常处理逻辑做了调整:当FactoryBean.getObjectType()抛出异常时(而不是按契约返回null表示无法确定类型),容器会打印这条INFO级日志。而Spring 5中这类异常会被静默处理,不会输出日志。
你的场景里,在BeanFactoryPostProcessor阶段创建代理服务时,此时容器的Bean定义还处于处理过程中,代理的TargetSource无法确定目标类,导致调用getObjectType()时触发AopConfigException,正好命中了Spring 6新增的日志逻辑。
你的实现可以怎么优化?
- 调整代理创建时机:
不要在BeanFactoryPostProcessor中直接定义代理Bean,改用@Configuration类配合@Bean方法来创建代理,或者把代理逻辑放到BeanPostProcessor中(在Bean实例化后再生成代理),这样能确保目标类已经被容器正确识别。 - 修正FactoryBean的实现:
如果必须用FactoryBean创建代理,确保getObjectType()方法在无法确定目标类型时返回null,而不是抛出异常。比如先检查TargetSource是否能获取到目标类,无法获取时直接返回null,符合FactoryBean的契约规范。
补充说明
虽然这条日志是非致命的,应用能正常运行,但遵循Spring的契约规范调整实现,既能消除日志干扰,也能让Bean的创建流程更符合容器的生命周期设计。
内容的提问来源于stack exchange,提问作者JanDasWiesel
相关产品推荐
相关产品推荐

