Skip to content

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

Description

@zndo

问题日志:
�[31mWARN �[0;39m �[36mo.s.c.annotation.ConfigurationClassPostProcessor:514�[0;39m - 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();
    }

  2. 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 增强。该警告不影响任何功能,可安全忽略。

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions