【问题标题】:Annotation-driven dependency injection which handles different environments处理不同环境的注解驱动的依赖注入
【发布时间】:2012-11-09 12:50:12
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: java spring dependency-injection annotations guice


    【解决方案1】:

    很遗憾,我无法对 Guice 发表评论,但正如 cmets 中所述,您确实可以使用 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。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 2012-06-25
        • 1970-01-01
        • 1970-01-01
        • 2023-03-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-08
        • 1970-01-01
        相关资源
        最近更新 更多