注释驱动的依赖注入,处理不同的环境

时间:2012-11-21 09:46:21

标签: java spring dependency-injection annotations guice

我认为许多专业人士没有转向注释驱动的依赖注入的主要原因是它不支持在开发/测试/生产环境之间切换。出于开发目的,在许多情况下,您不仅使用不同的服务(以及它们的连接),但有时您需要模拟它们,或者创建Dummy实例。

昨天我找到了一个使用Spring注释的解决方案:

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

......哪个应该有用,但不好看。

我会对你的解决方案或论点非常感兴趣:为什么这不是一个真正的问题;-) 欢迎Guice,Spring或任何其他人。

最初的问题是这个帖子的一部分:Spring @Autowired usage,但我认为值得创建一个新线程。

2 个答案:

答案 0 :(得分:11)

不幸的是我无法对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 :(得分:-1)

@Value注释不会像您尝试过的那样起作用。它只能以String的形式为您提供值。对于您想要实现的目标,您可以按照@ShyJ的建议尝试Spring Profiles。

希望这会对你有所帮助。欢呼声。