我有一个 springboot 启动模块,它正在读取一个配置文件,并使用它尝试构建一个任意类型的新 bean 并将它们添加到 bean 工厂中。
@Configuration
class SomeConfig implements BeanFactoryAware {
BeanFactory beanFactory
@Autowired
ConfigData configData
@Override
void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory
}
@PostConstruct
void addMoreBeans() {
ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory) beanFactory
configurableBeanFactory.registerSingleton('someObject', new SomeObject())
}
}
@RestController //( in the application )
class SomeController {
@Autowired
SomeObject someObject // this is null.
}
当我尝试访问 SpringBootApplication 中类型为"SomeObject"的 bean(在控制器 bean 中(时,它使用的是包含上述配置 bean 的启动模块,它不是自动连接的。
我可以看到,它在启动过程的后期初始化了这些豆子,但没有及时初始化自动连线工作。
有没有办法强制启动模块中的 bean 首先初始化。?
addMoreBeans
可以在运行setBeanFactory
之前运行。
因此,您可以按如下方式编写代码:
@Configuration
class SomeConfig implements BeanFactoryAware {
BeanFactory beanFactory
@Autowired
ConfigData configData
@Override
void setBeanFactory(BeanFactory beanFactory) {
this.beanFactory = beanFactory
beanFactory.registerSingleton('someObject', new SomeObject()
}
}
@Bean
可能是更好的方法。
@Configuration
class SomeConfig2 {
@Bean
public SomeObject getSomeObject() {
return new SomeObject();
}
}