You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

实现ImportBeanDefinitionRegistrar时Spring Boot Context为null的问题

问题原因

ImportBeanDefinitionRegistrar的registerBeanDefinitions方法执行时机早于Spring依赖注入阶段,且实现该接口的类实例不会被Spring容器作为Bean管理,因此直接通过@Autowired注入的Context会为null。

解决方案

移除@Autowired注入逻辑,在registerBeanDefinitions方法中从ConfigurableListableBeanFactory手动获取Context实例:

修改后的BeanRegistry代码:

@Slf4j
class BeanRegistry implements ImportBeanDefinitionRegistrar {

    private final ClassScanner classScanner = new ClassScanner();

    @Override
    public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

        ConfigurableListableBeanFactory beanFactory = ((ConfigurableListableBeanFactory) registry);
        // 手动获取Context实例
        Context context = beanFactory.getBean(Context.class);
        
        List<Class<?>> classes = classScanner.findAnnotatedClasses("*", MyCustomAnnotation.class);

        classes.forEach(c -> {
         
            String name = c.getSimpleName().toLowerCase();

            if (!context.isEntityPresent(name)) {
                // Rest of the logic
            } else {
               // Throw some error
            }
        });
    }
}
注意事项
  • 确保Context类所在包被@ComponentScan扫描覆盖,否则Spring容器中不存在Context实例,调用getBean会抛出NoSuchBeanDefinitionException。
  • 若因扫描顺序导致Context的BeanDefinition未提前注册,可先手动将Context的BeanDefinition注册到registry中,再调用getBean获取实例。

内容的提问来源于stack exchange,提问作者Shaiq Kar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 14:39:55