dromara / dromara/liteflow

LiteFlow 2.13.0 及之前版本的一个已知代码问题

Open
#94 1 comment 1 reaction 0 assignees View on GitHub
Dominant language
Java
Stars
3.9k
Forks
525
PR merge metrics
No merged PRs in 30d

Description

问题日志:
WARN  o.s.c.annotation.ConfigurationClassPostProcessor:514 - Cannot enhance @Configuration bean definition 'com.yomahub.liteflow.springboot.config.LiteflowMainAutoConfiguration' since its singleton instance has been created too early. The typical cause is a non-static @Bean method with a BeanDefinitionRegistryPostProcessor return type: Consider declaring such methods as 'static' and/or marking the containing configuration class as 'proxyBeanMethods=false'.
分析处理:
1. LiteflowMainAutoConfiguration 类注解:
@Configuration // ← 标记为 @Configuration,Spring 默认会对它做 CGLIB 代理增强
@AutoConfigureAfter(LiteflowPropertyAutoConfiguration.class)
@ConditionalOnBean(LiteflowConfig.class)
public class LiteflowMainAutoConfiguration {
注意:没有 proxyBeanMethods = false,Spring 会用 CGLIB 生成代理类来保证 @Bean 方法间的 Full Mode 语义。2. 关键 @Bean 方法:
@Bean
public DeclBeanDefinition declBeanDefinition() {
return new DeclBeanDefinition();
}
3. DeclBeanDefinition 实现了 BeanDefinitionRegistryPostProcessor:
public class DeclBeanDefinition
implements BeanDefinitionRegistryPostProcessor { // ← 关键!

public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) {
// 扫描 @LiteflowComponent 注解的类,注册为 BeanDefinition
}
}
触发机制
Spring 的 ConfigurationClassPostProcessor 需要对 @Configuration 类做 CGLIB 增强,以保证 Full Mode 下 @Bean 方法间调用返回同一个 Bean。但增强时机有严格要求:
Spring 在处理 BeanDefinitionRegistryPostProcessor 时,必须立即实例化 DeclBeanDefinition
而 DeclBeanDefinition 是 LiteflowMainAutoConfiguration 的 @Bean 方法返回的
因此 LiteflowMainAutoConfiguration 自身也被提前实例化了
当 Spring 事后尝试对 LiteflowMainAutoConfiguration 做 CGLIB 增强时,发现它已经是单例了——无法再增强一个已实例化的对象
这就是警告的精确原因:一个返回 BeanDefinitionRegistryPostProcessor 类型的非 static @Bean 方法,导致了配置类被提前实例化。
影响
该警告无害,不影响功能。 原因:
LiteflowMainAutoConfiguration 的 @Bean 方法之间没有互相调用(declBeanDefinition() 不调用 componentScanner() 等),Full Mode 语义不必要
CGLIB 增强失败只意味着这些 @Bean 方法退化为 Lite Mode 行为,结果完全一致
LiteFlow 的规则引擎、组件扫描、链路执行均不受影响
结论:这是 LiteFlow 框架内部的代码结构问题,@Bean 方法返回 BeanDefinitionRegistryPostProcessor 且非 static,导致配置类被提前实例化而无法 CGLIB 增强。该警告不影响任何功能,可安全忽略。

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.