我有一个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.
}
当我尝试在使用包含上述配置bean的启动器模块的SpringBootApplication(在控制器bean中)访问类型为'SomeObject'的bean时,它不是自动装配的。
我可以看到,它在启动过程中稍后初始化这些bean,但不及时使autowire工作。
无论如何都要强制启动器模块中的bean首先进行初始化。 ?
答案 0 :(得分:0)
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();
}
}