2016-09-08 2 views
0

속성 파일을 사용하여 같은 이름의 빈을 여러 개 만들 필요가 있습니다. 예를 들어 :봄 - application.properties에서 동적으로 빈 생성하기

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

나는 각각의 예를 들어 인덱스에 대한 콩 (이 궁극적으로 토끼 대기열에 사용됩니다,하지만 난 일을 단순화하고 있습니다)을 작성하고 싶습니다. 지금까지 내가 작업하고있는 코드가있다.

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

내가 자바 파이썬으로 출력을 기대하지만,있어 "토끼 "다시 null로 돌아오고있다. 아무도 내가 잘못 가고 있다고 말할 수 있습니까? 예로서

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

이 목록 될 것입니다, 그래서 당신은 그것으로 인덱스를 추가해야합니다

답변

1

다음과 같은 코멘트를 사용하여 코드를 업데이트하시기 바랍니다.


가 중첩 된 형태 인 것처럼 ConfigurationProperties 객체의 필드가 처리되어야 함을 나타내는 NestedConfigurationProperty annoation 약
@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; 
    } 
} 

. 이 주석은 실제 바인딩 프로세스와 관련이 없지만 필드가 단일 값으로 바인딩되지 않았다는 힌트로 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; 
    } 
} 

일반적으로, 당신은 당신이 정상으로 RabbitsProperties를 삽입 할 수, 당신의 RabbitFlowProcessor.java에 그런 RabbitsProperties

에 중첩 된 내부 클래스로서이를 추가 할 수 있습니다.

@Component 
public class RabbitFlowProcessor implements BeanFactoryPostProcessor { 

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