2012-11-21 33 views
9

我認爲許多專業人員不會切換到註釋驅動的依賴注入的主要原因是它不支持在開發/測試/生產環境之間切換。出於開發目的,在許多情況下,您不僅使用不同的服務(以及它們的連接),但有時您需要模擬它們或創建虛擬實例。處理不同環境的註釋驅動的依賴注入

昨天,我想通了,和春天註解一個解決辦法:

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

...這應該工作,但不是很好。

我會對您的解決方案或論點非常感興趣:爲什麼它不是一個真正的問題;-)歡迎使用Guice,Spring或任何其他方法。

原始問題是此主題的一部分:Spring @Autowired usage,但我認爲它值得創建一個新的線程。

回答

9

不幸的是我不能評論Guice,但正如評論中提到的那樣,你確實可以使用Spring配置文件 - 如果你使用Spring 3.1或更高版本的話。

基於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" 

這可能是有用的時候在不同的環境中運行應用程序。

我個人儘量不依賴Spring配置文件。相反,我嘗試將外部屬性文件中的環境差異封裝在運行時傳遞給應用程序。這種方法目前運行良好,但ymmv。

-1

@Value註釋不能按照您嘗試過的方式工作。它只能以String的形式給你值。對於你想達到的目標,你可以試試@ShyJ建議的Spring Profiles。

希望這可以幫助你。乾杯。