복붙노트

[SPRING] Spring - application.properties에서 동적으로 빈 작성하기

SPRING

Spring - 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. ==============================

    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; 
        ......
    }
    
  2. from https://stackoverflow.com/questions/39381060/spring-dynamically-creating-beans-from-application-properties by cc-by-sa and MIT license