java - 处理不同环境的注解驱动的依赖注入(inject)

标签 java spring dependency-injection annotations guice

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

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

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

...这应该可以,但不是很好。

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

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

最佳答案

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

关于java - 处理不同环境的注解驱动的依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13490393/

相关文章:

winforms - 在用户控件中使用构造函数注入(inject)的方法?

java - 添加@Transactional 注释后注入(inject)停止

dependency-injection - Autofac 能否按照注册顺序返回某个类型的所有服务?

java - 重定向Android中C程序的STDIN和STDOUT

java - 一般: Search time in algorithm

java - 为什么我的单词是一个空字符串,当我用\\s 拆分()我的字符串时

java - 如何让 Spring 缓存存储 ResponseBody 而不是中间对象

java - 如何检测它是最近按钮、多窗口模式还是主页按钮 onUserLeaveHint()

java - 控制台上的 DBCL 消息

java - <上下文 :annotation-config> and <context:component-scan>