2016-09-08 90 views
0

我需要使用屬性文件創建多個相同名稱的bean。例如:Spring - 從application.properties動態創建Bean

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

我想爲每個例如索引一個Bean(這將最終被用於兔隊列,但我簡化的東西)。以下是我正在使用的一些代碼。

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

我期待的輸出爲Java的Python的,但「兔子「現在迴歸爲空。任何人都可以告訴我哪裏出錯了嗎?

回答

1

請下面的評論更新您的代碼:

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

如示例將是一個列表,所以你需要用它添加索引。


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

關於NestedConfigurationProperty annoation,指示就好像它是一個嵌套類型在ConfigurationProperties對象的字段應及時治療。 此註釋與實際的綁定過程沒有關係,但它被spring-boot-configuration-processor用作暗示字段未被綁定爲單個值的提示。


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

通常情況下,你可以在你RabbitFlowProcessor.javaRabbitsProperties

然後將其添加爲嵌套的內部類,你可以注入的RabbitsProperties正常。

@Component 
public class RabbitFlowProcessor implements BeanFactoryPostProcessor { 

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