복붙노트

[SPRING] 다른 환경을 처리하는 주석 기반 종속성 주입

SPRING

다른 환경을 처리하는 주석 기반 종속성 주입

많은 전문가가 주석 중심 종속성 주입으로 전환하지 않는 주된 이유는 개발 / 테스트 / 프로덕션 환경 간의 전환을 지원하지 않는다는 것입니다. 대부분의 경우 개발 목적을 위해 다른 서비스 (및 연결)뿐만 아니라 모의하거나 더미 인스턴스를 만들어야하는 경우가 있습니다.

어제 스프링 어노테이션으로 한 가지 해결책을 찾아 냈습니다.

    @Value("#{${env} == "production" ? realService : dummyService}")
    private SomeService service;

... 어느 쪽이 좋을까. 좋지는 않아.

나는 당신의 해결책, 또는 주장에 대해 매우 흥미가있을 것입니다 : 왜 그것이 진짜 문제가 아닌가?;) Guice, Spring 또는 다른 사람들도 환영합니다.

원래 문제는이 스레드의 일부였습니다. Spring @Autowired 사용법이지만 새로운 스레드를 만들 가치가 있다고 생각했습니다.

해결법

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

    1.불행히도 Guice에 대해서는 언급 할 수 없지만, 주석에서 언급했듯이 Spring 3.1 이상을 사용하고 있다면 실제로 Spring 프로파일을 사용할 수 있습니다.

    불행히도 Guice에 대해서는 언급 할 수 없지만, 주석에서 언급했듯이 Spring 3.1 이상을 사용하고 있다면 실제로 Spring 프로파일을 사용할 수 있습니다.

    프로파일을 사용하는 Java 기반 구성은 다음과 유사 할 수 있습니다.

    @Configuration
    @Profile("production")
    public class ProductionConfig {
        @Bean 
        public SomeService someService() { ... }
    }
    
    @Configuration
    @Profile("dev")
    public class DevelopmentConfig {
        @Bean 
        public SomeService someService() { ... }
    }
    

    그러면 소비하는 클래스가 다시 단순 해집니다.

    ...
    @Autowired
    private SomeService someService;
    ...
    

    원하는 프로파일은 시스템 속성을 통해 활성화 될 수 있습니다.

    -Dspring.profiles.active="production"
    

    다른 환경에서 애플리케이션을 실행할 때 유용 할 수 있습니다.

    개인적으로 저는 스프링 프로파일에 전혀 의존하지 않습니다. 대신 런타임에 응용 프로그램에 전달되는 외부 특성 파일의 환경 차이를 캡슐화합니다. 이 접근 방식은 지금까지 잘 작동했지만 ymmv.

  2. ==============================

    2.@Value 주석은 사용자가 시도한 방식으로 작동하지 않습니다. String의 형태로 값을 줄 수 있습니다. 당신이 원하는 것을 얻기 위해 @ShyJ가 제안한대로 스프링 프로파일을 시도 할 수 있습니다.

    @Value 주석은 사용자가 시도한 방식으로 작동하지 않습니다. String의 형태로 값을 줄 수 있습니다. 당신이 원하는 것을 얻기 위해 @ShyJ가 제안한대로 스프링 프로파일을 시도 할 수 있습니다.

    희망이 당신을 도와줍니다. 건배.

  3. from https://stackoverflow.com/questions/13490393/annotation-driven-dependency-injection-which-handles-different-environments by cc-by-sa and MIT license