Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用Guice在play框架中注入配置值

使用Guice在play框架中注入配置值
EN

Stack Overflow用户
提问于 2016-05-24 06:32:29
回答 4查看 3.5K关注 0票数 1

我用conf/application.conf玩网络应用程序(没什么不寻常的)。Guice用于依赖注入。如何在类构造函数中注入属性值?代码如下。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class MyController @Inject() (private val foo: Foo) extends Controller {
    ...
}

@ImplementedBy(classOf[FooImpl])
trait Foo { 
    def bar: String
}

class FooImpl extends Foo {
    override val bar = current.configuration.getString("my.bar").get
    ...
}

在当前的配置中,如果不运行应用程序,就无法测试FooImpl。我希望能够在单元测试中实例化FooImpl。在我看来,完美的解决方案应该是这样的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class FooImpl @Inject() (@Named("my.bar") override val bar: String) extends Foo {
    ...
}

不幸的是,这段代码无法工作,因为Guice没有“my.bar”绑定:

没有绑定带@com.google.inject.name.Named注释的@com.google.inject.name.Named(value=my.bar)的实现。

我想出的唯一解决方案是编写自己的模块,它迭代配置属性并将它们绑定为命名依赖项(来自文档的示例的一个变体)。但我相信有一种更好的办法。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2017-07-24 22:06:06

大约一年后,我遇到了同样的问题,这次我想出了以下解决方案(非常类似于由“陌生人”提出的建议@droidman):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class InjectionModule extends AbstractModule {

  override def configure(): Unit = {

    val config: Config = TypesafeConfigReader.config
    config.entrySet().asScala.foreach { entry =>
      val path = entry.getKey
      entry.getValue.valueType() match {
        case ConfigValueType.NUMBER =>
          bind(classOf[Int])
            .annotatedWith(Names.named(path))
            .toInstance(config.getInt(path))
        case ConfigValueType.BOOLEAN =>
           bind(classOf[Boolean])
             .annotatedWith(Names.named(path))
             .toInstance(config.getBoolean(path))
        case ConfigValueType.STRING =>
           bind(classOf[String])
             .annotatedWith(Names.named(path))
             .toInstance(config.getString(path))
        case _ =>
      }
    }
  }
}

此外,还可以通过在系统属性中添加前缀(键-值对是加载配置的一部分)来扩展此方法:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
private def getPrefix(configValue: ConfigValue): String = {
  val description = configValue.origin().description()
  if (description.contains("system properties")) {
    "sys."
  } else {
    ""
  }
}

在这种情况下,人们应该使用Names.named(path),而不是编写Names.named(getPrefix(entry.getValue) + path)

票数 1
EN

Stack Overflow用户

发布于 2016-05-24 07:46:57

我使用Java实现了这个功能。我希望您可以将它用作Scala实现的参考。

首先,我创建了一个模块:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainModule extends AbstractModule {
    public final static String TIMEOUT_IN_MILLISECONDS_ANNOTATION = "timeout-promise";
    private final Configuration configuration;

    public MainModule(@SuppressWarnings("unused") Environment environment, Configuration configuration) {
        this.configuration = configuration;
    }

    @Override
    protected void configure() {
        long timeoutInMilliseconds = configuration.getLong("application.promise.timeout.in.milliseconds", 0L);
        bindConstant().annotatedWith(Names.named(TIMEOUT_IN_MILLISECONDS_ANNOTATION)).to(timeoutInMilliseconds);
    }
}

之后,我只在不同的地方使用了注释:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class Service {

    @Inject
    @Named(MainModule.TIMEOUT_IN_MILLISECONDS_ANNOTATION)
    protected long timeoutInMilliseconds;

}

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2016-05-25 07:45:59

不久前,我开发了用于映射到Enum上的简单注入配置变量的小guice扩展程序。

guice-config

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37416614

复制
相关文章
Google开源依赖注入框架-Guice指南
之前发过一篇文章《浅谈依赖注入的实现》,介绍了依赖注入的实现原理。文中提到高效实现依赖注入的工具Guice,本文就介绍一下这款Google开源的依赖注入框架Guice及其使用方法。
互联网金融打杂
2022/08/01
2.1K0
TestNG 中使用 Guice 来进行依赖注入
Guice是Google开发的一个轻量级,基于Java5(主要运用泛型与注释特性)的依赖注入框架(IOC)。
HoneyMoose
2023/04/24
5710
TestNG 中使用 Guice 来进行依赖注入
Guice依赖注入(Provider)
本文章主要详细讲解Guice依赖注入中的Provider服务注入实现,一般都是用于外部服务的注入,比如实现Redis等。
程序猿梦工厂
2021/08/30
1.1K0
Guice依赖注入(Scope)
本文章主要详细讲解Guice依赖注入中的一些高级选项,他们分别是Scope,Eagerly Loading Bindings,Stage,Optional Injection。我们将一一对他们进行讲解。
程序猿梦工厂
2021/09/06
1.1K0
Guice依赖注入(构造函数)
本教程主要详细讲解Guice的构造函数注入. 我们将通过详细的代码以及步骤进行讲解.
程序猿梦工厂
2021/08/19
7730
Guice依赖注入(基础版)
本教程主要详细讲解Guice的一些基本注入方式,通过该简单教程让我们可以快速使用Guice进行简单系统化开发,后续我们会更深入讲解更多模块,如果还不了解Guice大家可以先去网上自行了解一下.
程序猿梦工厂
2021/08/18
1.2K0
使用Dagger2做静态注入, 对比Guice.
Dagger 依赖注入的诉求, 这边就不重复描述了, 在上文Spring以及Guice的IOC文档中都有提及, 既然有了Guice, Google为啥还要搞个Dagger2出来重复造轮子呢? 因为使用
用户1216491
2018/01/24
2.9K2
Spring框架中 Bean对象属性值的注入
注意:如果一个Bean对象同时存在set注入和构造注入两种方法,Spring在为Bean对象属性赋值时,会先使用set注入方式为属性赋值,再使用构造注入为Bean对象属性赋值。
运维搬砖
2018/12/26
4.1K0
Guice集成Properties配置
在大多数项目中我们经常会使用到读取配置文件,用于适配自定义的属性值等,本教程我们主要通过实现对Properties的解析实现基于Guice的配置解析Module.
程序猿梦工厂
2022/03/01
8560
Guice依赖注入(接口多实现)
本文章主要详细讲解Guice依赖注入中的特性接口多实现,一般使用到guice的框架的插件机制都是基于该方式实现。
程序猿梦工厂
2021/08/26
9090
3分钟带你了解轻量级依赖注入框架Google Guice【享学Java】
说起依赖注入(DI),相信你首先想到的必然是Spring,Spring是Java技术全家桶,是Java EE开发的一站式解决方案和实际开发标准。但本文并不聊它,而是介绍一款谷歌开源的轻量级依赖注入框架:Guice。
YourBatman
2020/03/26
5.7K0
一个完整的TDD演练案例(完)
测试驱动开发完整案例的最后一部分,除完成了整个案例的测试驱动之外,还介绍了依赖注入以及测试驱动开发的定律与原则。
张逸
2019/03/07
1.9K0
Elasticsearch 中的 Guice
Elasticsearch 源代码中使用了Guice框架进行依赖注入. 为了方便阅读源码, 此处我先通过模仿ES guice的使用方式简单写了一个基本Demo 方便理解, 之后再来理一下ES的Guice使用. 编写的测试类原理图如下:
小旋锋
2019/01/21
1.3K0
谈谈 Act 的依赖注入 和 模板输出 - 回答 drinkjava 同学提问
依赖注入工具 jBeanBox 的作者 drinkjava 同学最近在 Actframework gitee 项目 的提出了如下评论:
老码农
2019/12/02
7360
回 Yong9981 关于 Act-1.8.32 发布新闻中的评论
@yong9981 在 actframework-1.8.32 发布新闻 中提出了一下问题:
老码农
2020/03/12
5580
在SSM框架中配置定时任务
在项目中需要添加一个定时任务,完成每天晚上访问第三方接口用于同步数据,在实际中这样的定时任务需求很多,比如系统日志,备份等等,特在网上找了相关内容。 此处使用的是SSM框架,SpringMVC的配置文件都在springmvc.xml中。 1. 在springmvc.xml添加如下内容 在xmlns中添加
geekfly
2022/05/06
1K0
在springboot 中配置使用servlet
还记得,说到web项目,最早接触的就是servlet,实际上SSH项目,也是依赖于servlet,在web.xml文件中进行配置。那么使用了springboot之后,不仅有一个疑问,虽然SpringMVC已经帮我们很容易的实现了spring web项目的使用,只需要@Controller就能搞定。但是我们需要使用servlet该如何做呢?虽然这种需求非常少,但是在springboot的官方文档对servlet的使用有过描述。下面我们来看看在springboot中如何使用和配置servlet。
冬天里的懒猫
2021/03/02
5K0
阿里Druid数据连接池在SSM框架中的配置使用
首先可以参考阿里在GitHub给出的一些说明:
似水的流年
2018/01/14
2.7K0
Java自动化测试框架-09 - TestNG之依赖注入篇 (详细教程)
TestNG支持两种不同类型的依赖项注入:本机(由TestNG本身执行)和外部(由诸如Guice的依赖项注入框架执行)。
北京-宏哥
2019/11/10
1.9K0
使用 Play Mongo 简化 Play Json 开发
Play Mongo 是一个专门为 Play Framework 开发的 MongoDB 模块,该模块提供了一个隐式方法可以简化 Play Json 的开发工作。
joymufeng
2019/03/12
9370

相似问题

在Guice中配置多个注入

22

在play 2.5中使用guice注入akka角色

26

Scala Play Guice依赖注入失败

1100

使用接口进行Play和Guice依赖注入

120

Scala Play Guice使用注入器手动注入单例类,该类将配置注入到其构造函数中

12
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文