복붙노트

[SPRING] 런타임 생성자 인자를 가진 스프링 빈

SPRING

런타임 생성자 인자를 가진 스프링 빈

런타임시 전달되는 생성자 인자가있는 Spring 자바 설정에서 Spring 빈을 만들고 싶다. 생성자에서 몇 가지 인수를 예상하는 bean fixedLengthReport가있는 다음 Java 구성을 작성했습니다.

@Configuration
Public AppConfig {

@Autowrire
Dao dao;

@Bean
@Scope(value = "prototype")
**//SourceSystem can change at runtime**
public FixedLengthReport fixedLengthReport(String sourceSystem) {
       return new TdctFixedLengthReport(sourceSystem, dao);
}

그러나 빈이 발견되지 않아 sourceSystem이 연결할 수 없다는 오류가 발생합니다. 어떻게 런타임 생성자 인자로 빈을 생성 할 수 있습니까?

Spring 4.2를 사용하고 있습니다.

해결법

  1. ==============================

    1.BeanFactory와 함께 프로토 타입 빈을 사용할 수 있습니다.

    BeanFactory와 함께 프로토 타입 빈을 사용할 수 있습니다.

    @Configuration
    public class AppConfig {
    
       @Autowired
       Dao dao;
    
       @Bean
       @Scope(value = "prototype")
       public FixedLengthReport fixedLengthReport(String sourceSystem) {
           return new TdctFixedLengthReport(sourceSystem, dao);
       }
    }
    

    @Scope (value = "prototype")은 Spring이 시작시 Bean을 인스턴스화하지 않는다는 것을 의미하지만 필요시 나중에 처리 할 것입니다. 이제 프로토 타입 bean의 인스턴스를 사용자 정의하려면 다음을 수행해야한다.

    @Controller
    public class ExampleController{
    
       @Autowired
       private BeanFactory beanFactory;
    
       @RequestMapping("/")
       public String exampleMethod(){
          TdctFixedLengthReport report = 
             beanFactory.getBean(TdctFixedLengthReport.class, "sourceSystem");
       }
    }
    

    시작시 Bean을 인스턴스화 할 수 없으므로 Bean을 직접 Autowire하지 않아야합니다. 그렇지 않으면 Spring은 빈 자신을 인스턴스화하려고 시도 할 것이다. 이 사용은 오류를 일으킬 것입니다.

    @Controller
    public class ExampleController{
    
       //next declaration will cause ERROR
       @Autowired
       private TdctFixedLengthReport report;
    
    }
    
  2. ==============================

    2.BeanFactory # getBean (String name, Object ... args) 메소드를 사용하여 매개 변수가있는 프로토 타입을 얻으려면 코드가 멋지게 보입니다.

    BeanFactory # getBean (String name, Object ... args) 메소드를 사용하여 매개 변수가있는 프로토 타입을 얻으려면 코드가 멋지게 보입니다.

    Spring Java Config : 런타임 인자로 프로토 타입 범위의 @Bean을 만드는 방법은? BeanFactory # getBean (String name, Object ... args) 당신이 찾고있는 것이다.

    나는 당신의 IDEA (제 경우 IntelliJ IDEA 버전 15)가 당신에게 오류를주고 그것이 런타임 / 컴파일 시간 오류가 아니라고 생각합니다.

    IntelliJ에서는 스프링 검사의 설정을 변경할 수 있습니다.

  3. from https://stackoverflow.com/questions/35108778/spring-bean-with-runtime-constructor-arguments by cc-by-sa and MIT license