使用@Autowired注入@Bean实例报lateinit属性未初始化如何解决
问题根源
代码存在3个核心错误共同导致注入失败:
- Kotlin单例类
object InvokerConfiguration标注的是@Component而非@Configuration注解,且Kotlin object类下的方法默认是非静态的,Spring无法正常解析该类下的@Bean声明 ConfigurationServiceInvoker已经加了@Component会自动被Spring扫描注册,又在配置类里手动用@Bean重复声明了同类型Bean,会引发冲突- 若在注入类的构造方法/初始化代码块里直接调用
configurationServiceInvoker.getRules(),此时Spring还未完成属性注入,自然会报lateinit未初始化错误
修复方案
方案一:删除冗余Bean声明(最简方案)
已经给ConfigurationServiceInvoker加了@Component注解的前提下,只要该类在Spring组件扫描路径下,不需要额外配置@Bean,直接删除整个InvokerConfiguration类即可,注入逻辑无需修改。
如果调用逻辑是在类初始化阶段执行,改为使用@PostConstruct注解包裹调用逻辑,保证注入完成后再执行:
@Service class YourBusinessService { @Autowired private lateinit var configurationServiceInvoker: ConfigurationServiceInvoker // 该方法会在Spring完成所有属性注入后自动执行 @PostConstruct fun init() { val request = RulesRequest() val response = configurationServiceInvoker.getRules(request) } }
方案二:保留@Bean配置的修正方式
如果确实需要手动声明Bean,按以下步骤修改:
- 先删除
ConfigurationServiceInvoker类上的@Component注解,避免重复Bean冲突 - 把
InvokerConfiguration的@Component改为@Configuration,去掉object修饰改为普通类:
@Configuration class InvokerConfiguration { @Bean fun getConfigurationServiceInvoker(): ConfigurationServiceInvoker { return ConfigurationServiceInvoker() } }
- 同样保证调用
getRules的逻辑是在Spring容器初始化完成后执行,不要放在类构造阶段。
额外排查点
如果上述修改后仍有问题,检查ConfigurationServiceInvoker所在的包是否在SpringBoot启动类的扫描路径下,如果不在可以用@ComponentScan(basePackages = ["你的包名"])手动指定扫描路径。
内容的提问来源于stack exchange,提问作者WCY
相关产品推荐
相关产品推荐

