복붙노트

[SPRING] 런타임 스프링에 삽입 할 구현 선택

SPRING

런타임 스프링에 삽입 할 구현 선택

나는 다음 수업을 듣는다 :

public interface MyInterface{}

public class MyImpl1 implements MyInterface{}

public class MyImpl2 implements MyInterface{}

public class Runner {
        @Autowired private MyInterface myInterface;
}

앱이 이미 실행 중일 때 (즉, 시작 단계가 아니라면) 어떤 구현을 러너에 주입해야하는지 결정하고 싶습니다.

이렇게 이상적으로 이런 식으로 :

ApplicationContext appContext = ...
Integer request = ...

Runner runner = null;
if (request == 1) {
        //here the property 'myInterface' of 'Runner' would be injected with MyImpl1
        runner = appContext.getBean(Runner.class) 
}
else if (request == 2) {
        //here the property 'myInterface' of 'Runner' would be injected with MyImpl2
        runner = appContext.getBean(Runner.class)
}
runner.start();

가장 좋은 방법은 무엇입니까?

해결법

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

    1.@Component ( "implForRq1") 및 @Component ( "implForRq2")를 사용하여 구현을 선언하십시오.

    @Component ( "implForRq1") 및 @Component ( "implForRq2")를 사용하여 구현을 선언하십시오.

    그런 다음 둘 다 주입하고 다음을 사용하십시오.

    class Runner {
    
        @Autowired @Qualifier("implForRq1")
        private MyInterface runnerOfRq1;
    
        @Autowired @Qualifier("implForRq2")
        private MyInterface runnerOfRq2;
    
        void run(int rq) {
            switch (rq) {
                case 1: runnerOfRq1.run();
                case 2: runnerOfRq2.run();
                ...
    
            }
        }
    
    }
    
    ...
    
    @Autowired
    Runner runner;
    
    void run(int rq) {
        runner.run(rq);
    }
    
  2. from https://stackoverflow.com/questions/19231875/choose-which-implementation-to-inject-at-runtime-spring by cc-by-sa and MIT license