基于注解的依赖注入,适用于不同的环境配置。

9

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

昨天我通过Spring注解找到了一个解决方案:

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

这应该是可行的,但不够好。

我非常希望能听到您的解决方案或者争论:为什么这不是一个真正的问题呢?欢迎使用Guice,Spring或任何其他框架。

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

2个回答

12

很遗憾我不能就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"

当在不同的环境中运行应用程序时,这可能非常有用。

个人而言,我尽量不依赖Spring配置文件。相反,我会将环境差异封装在外部属性文件中,并在运行时将它们传递给应用程序。这种方法到目前为止效果很好,但可能因人而异。


-1

@Value 注解不是你尝试的那种方式。它只能以字符串形式提供值。为了实现你想要的功能,你可以尝试使用 @ShyJ 建议的 Spring Profiles。

希望这能帮到你。干杯。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接