9

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

昨天我想出了一个带有 Spring 注释的解决方案:

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

...这应该工作,但不是很好。

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

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

4

2 回答 2

12

不幸的是,我无法对 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。

于 2012-11-21T13:38:03.590 回答
-1

@Value注释无法按照您尝试的方式工作。它只能以字符串的形式为您提供值。对于您想要实现的目标,您可以按照@ShyJ 的建议尝试 Spring Profiles。

希望这对您有所帮助。干杯。

于 2012-11-21T13:25:05.437 回答