实现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
相关产品推荐
相关产品推荐

