2016-09-08 4 views
0

Ich habe mehrere Beans mit demselben Namen mithilfe der Eigenschaftendatei erstellen müssen. Zum Beispiel:Spring - Erstellen von Beans dynamisch aus application.properties

rabbit.example.language[0]=java 
rabbit.example.framework[0]=spring 
rabbit.example.language[1]=python 
rabbit.example.framework[1]=django 

würde Ich mag eine Bean für jedes Beispiel Index erstellen (dies letztlich für Kaninchen Warteschlangen verwendet werden, aber ich bin zu vereinfachen Dinge). Hier ist ein Code, mit dem ich bis jetzt arbeite.

Rabbits.java

@Configuration 
@ConfigurationProperties(prefix="example") 
public class Rabbits { 
    private String language; 
    private String framework; 

    public String getLanguage() { 
     return language; 
    } 

    public void setLanguage(String language) { 
     this.language= language; 
    } 

    public String getFramework() { 
     return framework; 
    } 

    public void setFramework(String framework) { 
     this.framework= framework; 
    } 
} 

Properties.java

@Configuration 
@ConfigurationProperties(prefix = "rabbit") 
public class Properties { 

    @NestedConfigurationProperty 
    private List<Rabbits> rabbits = new ArrayList<Rabbits>(); 

    public List<Rabbits> getRabbits() { 
     return rabbits; 
    } 

    public void setRabbits(List<Rabbits> rabbits) { 
     this.rabbits = rabbits; 
    } 

    @Bean 
    RabbitFlowProcessor rabbitFlowProcessor(List<Rabbits> rabbit){ 
     return new RabbitFlowProcessor(rabbit); 
    } 

} 

RabbitFlowProcessor.java:

@Component 
public class RabbitFlowProcessor implements BeanFactoryPostProcessor { 

    private List<Rabbits> rabbits; 

    public RabbitFlowProcessor(List<Rabbits> rabbits) { 
     this.rabbits = rabbits; 
    } 

    @Override 
    public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { 
     rabbits.stream() 
       .forEach(rabbit -> { 
        System.out.println(rabbit.getLanguage()); 
       }); 
    } 
} 

ich die Ausgabe erwartete Java Python zu sein, aber die „Kaninchen "kommen als null zurück. Kann mir jemand sagen, wo ich falsch liege?

Antwort

1

Bitte aktualisieren Sie Ihre Codes mit folgenden Bemerkungen:

rabbit.example[0].language=java 
rabbit.example[0].framework=spring 
rabbit.example[1].language=python 
rabbit.example[1].framework=django 

Als Beispiel eine Liste sein, so müssen Sie den Index mit hinzufügen.


@Configuration 
@ConfigurationProperties(prefix = "rabbit") 
public class RabbitsProperties { 

    private List<Rabbits> example = new ArrayList<Rabbits>(); 

    public List<Rabbits> getExample() { 
     return example; 
    } 

    public void setExample(List<Rabbits> example) { 
     this.example = example; 
    } 
} 

Über den NestedConfigurationProperty annoation, die in einem ConfigurationProperties Objekt, dass ein Feld wie behandelt werden sollte zeigt an, ob es sich um eine verschachtelte Art waren. Diese Annotation hat keinen Einfluss auf die tatsächlichen Bindungsprozesse, wird aber von der spring-boot-configuration-processor als Hinweis darauf verwendet, dass ein Feld nicht als einzelner Wert gebunden ist.


public class Rabbits { 
    private String language; 
    private String framework; 

    public String getLanguage() { 
     return language; 
    } 

    public void setLanguage(String language) { 
     this.language= language; 
    } 

    public String getFramework() { 
     return framework; 
    } 

    public void setFramework(String framework) { 
     this.framework= framework; 
    } 
} 

der Regel, können Sie dies als eine verschachtelte innere Klasse hinzufügen in RabbitsProperties

Dann in Ihrem RabbitFlowProcessor.java, können Sie die RabbitsProperties als normal injizieren kann.

@Component 
public class RabbitFlowProcessor implements BeanFactoryPostProcessor { 

    @Autowired 
    private RabbitsProperties rabbitsProperties; 
    ...... 
} 
Verwandte Themen