2017-08-21 4 views
1

Ich muss eine dynamisch erstellte Bean hinzufügen, wenn meine "normale" Bean erstellt wird. Ich habe versucht, diese so weit:wie man eine dynamisch erzeugte Bean in einem @PostConstruct im Spring Boot hinzufügt

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

ich eine SolrHealthIndicatior Bohne programmatisch bauen, wie ich bin nicht Frühling Solr Daten verwenden. Jetzt möchte ich es registriert haben, damit es in/health angezeigt wird.

Ich habe meinen Kontext verdrahtet, aber nicht finden kann, wie das neu erstellte Bean dort registrieren ...

Antwort

1

Sie sollten in der Lage zu programatically Bean zu definieren, indem die @Bean Annotation innerhalb einer @Configuration Klasse.

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

Dann können Sie injizieren es wie jede andere Bohne (@Autowired Konstruktor, Feld, Setter Injektion, etc.), wenn es mehr Bohnen mit dem gleichen Typ sind Sie @Qualifier zwischen ihnen unterscheiden können.

+0

hat perfekt funktioniert, danke – Persimmonium

0

Sie benötigen @Lookup Anmerkung zu verwenden.

@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

mmm, nicht sicher, ich folge. SolrHealthIndicator ist eine eingebaute Klasse, ich muss sie nicht definieren, denke ich? Und dann, wo erklärst du solrHealthIndicator? Ich denke, Sie müssen es auf irgendeine Weise deklarieren (Anmerkung oder was auch immer), damit es automatisch registriert wird? Oder kommentiert der Getter mit @lookup bereits das? Danke – Persimmonium

+0

In diesem Fall müssen Sie möglicherweise XML-basierte Suche verwenden. https://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-factory-lookup-method-injection – yaswanth

+0

Ich muss * eine Singleton Bean * registrieren (dass ich create) Wenn eine andere Singleton-Bean von Spring erstellt wird, scheint @lookup nicht dabei zu helfen, wenn ich mich nicht irre. – Persimmonium

0

Sie könnten der Klasse machen mit Ihrem @PostConstructBeanDefinitionRegistryPostProcessor implementieren. Dann würden Sie dann in der Lage sein, Ihre Bohnen registrieren programmatisch:

@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

danke, könnte funktionieren, habe nicht versucht, @Magnus 'Antwort war viel einfacher – Persimmonium

+0

Ah, ja, auf jeden Fall. Ich dachte, du hättest eine bestimmte Anforderung, so dass du es mit der 'PostConstruct'-Methode machen wolltest. @Magnus 'Antwort ist definitiv die Standard-Option und die Art, wie Sie gehen sollten – Ben

Verwandte Themen