如何在Spring Boot中的@PostConstruct中添加动态创建的bean

时间:2017-08-21 18:09:45

标签: spring spring-mvc spring-boot

当我的'普通'bean被创建时,我需要添加一个动态创建的bean。到目前为止我试过这个:

WITH_QT=ON

我以编程方式构建了一个SolrHealthIndicatior bean,因为我没有使用Spring Solr Data。现在我希望它已注册,因此它显示在/ health中。

我的上下文有线,但找不到如何在那里注册新创建的bean ...

3 个答案:

答案 0 :(得分:1)

您应该能够使用@Bean类中的@Configuration注释以编程方式定义bean。

@Bean
public SolrHealthIndicator solrHealthIndicatior() {
    //you can construct the object however you want
    return new SolrHealthIndicator();
}

然后您可以像任何其他bean(@Autowired构造函数,字段,setter注入等)一样注入它,如果有多个bean具有相同类型,则可以使用@Qualifier来区分它们。

答案 1 :(得分:0)

您需要使用@Lookup注释。

@Component
public class SolrHealthIndicator {

    public SolrHealthIndicator(Solr solr) {

    }
}


public class BeanInQuestion {

    @PostConstruct
    public void init() {
        solrHealthIndicator = getHealthIndicatorBean();
    }

    @Lookup
    public SolrHealthIndicator getHealthIndicatorBean() {
        //Spring creates a runtime implementation for this method
        return null;
    }

}

答案 2 :(得分:0)

您可以将该类包含在@PostConstruct工具BeanDefinitionRegistryPostProcessor中。然后,您就可以以编程方式注册bean:

@Bean
public class MyBean implements BeanDefinitionRegistryPostProcessor {

    private BeanDefinitionRegistry registry;

    @Override
    public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException {
        this.registry = registry;
    }

    @PostConstruct
    public void init(){
        registry.registerBeanDefinition("solrHealthIndicator", new SolrHealthIndicator(solr));
    }
}