2017-08-21 38 views
1

我需要在創建「普通」bean時添加一個動態創建的bean。我想這至今:如何在Spring Boot中的@PostConstruct中添加一個動態創建的bean

//generate a health bean dynamically, and register it 
@PostConstruct 
public void init(){ 
    solrhealth = new SolrHealthIndicator(solr); 
    //context.?? 
} 

我建立一個SolrHealthIndicatior豆編程,因爲我不使用Spring Solr的數據。現在我想要它註冊,所以它顯示在/健康。

我有我的背景下有線,但怎麼也找不到新創建的豆在那裏註冊...

回答

1

您應該能夠通過使用@Configuration類中@Bean註釋以編程方式定義你的bean。

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

然後,你可以注入它像其它bean(@Autowired構造,場,setter注入,等等),如果有多個豆與同類型你可以使用@Qualifier來區分它們。

+0

完美的工作方式,謝謝 – Persimmonium

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; 
    } 

} 
+0

嗯,不知道我關注。 SolrHealthIndicator是一個內建類,我不需要定義它,我猜?然後,你在哪裏宣佈solrHealthIndicator?我想你需要以某種方式聲明它(註釋或其他),以便它自動註冊?或者用@lookup accomplis註釋了getter?謝謝 – Persimmonium

+0

在這種情況下,您可能需要使用基於xml的查找。 https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-lookup-method-injection – yaswanth

+0

我需要*註冊*單身bean(即我創建)當Spring創建另一個單例bean時,如果我沒有弄錯,@lookup似乎沒有幫助。 – Persimmonium

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)); 
    } 
} 
+0

謝謝,可以工作,沒有嘗試,@Magnus的答案簡單得多 – Persimmonium

+0

啊,是的,絕對是。我以爲你有某種特定的要求,以至於你希望它發生在'PostConstruct'方法上。 @Magnus的答案絕對是更標準的選擇,你應該去 – Ben

相關問題