通过在springboot starter模块中读取配置来动态注册bean

时间:2017-08-16 06:29:40

标签: java spring-boot autowired

我有一个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首先进行初始化。 ?

1 个答案:

答案 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();
    }
}