2016-09-08 91 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; 
    ...... 
}