[SPRING] Spring - application.properties에서 동적으로 빈 작성하기
SPRINGSpring - application.properties에서 동적으로 빈 작성하기
나는 속성 파일을 사용하여 같은 이름의 여러 빈을 만들 필요가있다. 예 :
rabbit.example.language[0]=java
rabbit.example.framework[0]=spring
rabbit.example.language[1]=python
rabbit.example.framework[1]=django
각 예제 인덱스에 대해 Bean을 생성하고 싶습니다. (이것은 궁극적으로 Rabbit Queue에 사용되지만, 나는 단순화하고 있습니다.) 지금까지 내가 작업하고있는 코드가있다.
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이 될 것으로 기대하지만, "토끼"는 null로 돌아오고있다. 아무도 내가 잘못 가고 있다고 말할 수 있습니까?
해결법
-
==============================
1.다음 코드를 사용하여 코드를 업데이트하십시오.
다음 코드를 사용하여 코드를 업데이트하십시오.
rabbit.example[0].language=java rabbit.example[0].framework=spring rabbit.example[1].language=python rabbit.example[1].framework=django
예제는 List이므로 인덱스를 추가해야합니다.
@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 주석 정보는 ConfigurationProperties 객체의 필드가 중첩 된 유형 인 것처럼 처리해야 함을 나타냅니다. 이 주석은 실제 바인딩 프로세스와 관련이 없지만 스프링 부트 구성 프로세서는 필드가 단일 값으로 바인딩되지 않는다는 힌트로 사용됩니다.
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; ...... }
from https://stackoverflow.com/questions/39381060/spring-dynamically-creating-beans-from-application-properties by cc-by-sa and MIT license