使用 Google Guice 注入 java 属性

2024-04-19

我想使用 google guice 使属性在我的应用程序的所有类中可用。我定义了一个加载并绑定属性文件的模块测试属性.

Property1=TEST
Property2=25

包com.test;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.Properties;

import com.google.inject.AbstractModule;
import com.google.inject.name.Names;

public class TestConfiguration extends AbstractModule {

    @Override
    protected void configure() {
    Properties properties = new Properties();
    try {
        properties.load(new FileReader("Test.properties"));
        Names.bindProperties(binder(), properties);
    } catch (FileNotFoundException e) {
        System.out.println("The configuration file Test.properties can not be found");
    } catch (IOException e) {
        System.out.println("I/O Exception during loading configuration");
    }

    }
}

我正在使用一个主类,在其中创建一个注入器来注入属性。

package com.test;

import com.google.inject.Guice;
import com.google.inject.Injector;

public class Test {

    public static void main(String[] args) {
    TestConfiguration config = new TestConfiguration();
    Injector injector = Guice.createInjector(config);
    TestImpl test = injector.getInstance(TestImpl.class);
    }
}

package com.test;

import com.google.inject.Inject;
import com.google.inject.name.Named;

public class TestImpl {
    private final String property1;
    private final Integer property2;

        @Inject
        public TestImpl(@Named("Property1") String property1, @Named("Property2") Integer property2) {

        System.out.println("Hello World");
        this.property1 = property1;
        this.property2 = property2;

        System.out.println(property1);
        System.out.println(property2);

        }
     }

现在我的问题。如果我的 TestImpl 创建其他类,我也需要注入属性,并且这些类也需要注入属性,那么正确的方法是什么?

  1. 将注入器传递给所有子类,然后使用injector.getInstance(...) 创建子类?

  2. 实例化一个新的注入器,例如

    TestConfiguration config = new TestConfiguration();
    Injector injector = Guice.createInjector(config);
    TestImpl test = injector.getInstance(TestImpl.class);
    

在所有嵌套类中?

  1. 是否有其他方法可以使这些属性在所有类中可用?

将注入器传递给所有子类,然后使用 Injector.getInstance(...) 创建子类?

不,这样做你就违背了目的依赖注入 http://en.wikipedia.org/wiki/Dependency_injection模式并将所有实现耦合到 Guice。除了通过(现在标准化的)注释之外,您的实现根本不应该与 guice 交互。

实例化一个新的注入器,例如

TestConfiguration config = new TestConfiguration(); 
Injector injector = Guice.createInjector(config); 
TestImpl test = injector.getInstance(TestImpl.class); 

在所有嵌套类中?

不,这更糟糕,因为您最终会得到多个注入器,因此多个上下文将阻止正确使用scopes http://code.google.com/p/google-guice/wiki/Scopes.

理想情况下,您应该仅在应用程序引导期间使用注入器。当然,引导它的方式很大程度上取决于应用程序。

是否有其他方法可以使所有属性都可用 课程?

可以按照与 TestImpl 相同的方式注入属性。 如果您希望 TestImpl 使用一个还需要某些属性(或其他服务)的服务,只需让 Guice 将其注入到 TestImpl 即可。 Guice 负责所有实例化/连接。当 Guice 自己无法弄清楚时,您应该只通过使用活页夹告诉 Guice“如何继续”:

public class TestImpl {
    private final String property1;
    private final Integer property2;
    private final IService service;


        @Inject
        public TestImpl(@Named("Property1") String property1, @Named("Property2") Integer property2, IService service) {
           this.property1 = property1;
           this.property2 = property2;
           this.service= service;
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Google Guice 注入 java 属性 的相关文章

随机推荐

  • 构建 nspredicate 时的 EXC_BAD_ACCESS

    我正在计算生日和今天之间的月数 利用这个数字 我正在构建一个谓词来从核心数据中获取对象 尽管月数计算正确 如日志所示 但在构建谓词时我得到了 EXC BAD ACCESS 这是我的代码 NSCalendar gregorian NSCale
  • 隐藏网站文件夹/目录文件的最佳方法是什么[重复]

    这个问题在这里已经有答案了 如果我通过 www mysite com img 访问我的网站 我会看到以下内容 父目录 folder1 folder2 file1 file2 等等等等 但什么是best如何阻止人们访问我的网站文件夹和文件结构
  • 处理负整数的汇编 MASM

    我被指示用汇编语言编写一个程序 该程序将执行以下算术 A B C D A E 当没有负值发挥作用时 我成功地做到了这一点 但假设 A 5 B 4 C 3 D 2 和 E 1 这给了我们 5 4 3 2 5 1 或 6 这就是我需要帮助的地方
  • 通过@PersitenceContext或@PersitenceUnit注入EntityManagerFactory?

    我一直认为 PersistenceContext用于将EntityManager注入到容器管理的应用程序中 而 PersistenceUnit用于注入EntityManagerFactory Javadoc 说 对于持久性单元 http d
  • 适用于 mac 的免费 c++ 编译器不使用 xcode

    有没有适用于 Mac 且不需要 xcode 的免费 C 编译器 如果您安装了开发人员工具 包括 Xcode 那么您也会安装 GCC 您可以从命令行使用它 gcc o myprogram main cpp
  • 更快的循环:foreach 与 some(jsperf 的性能与 Node 或 chrome 不同)

    将数组的值恢复为简单的最佳方法是什么true or false values 我很困惑 因为 jsperf 给了我VERY与 google chrome 控制台 nodejs 或任何其他 JS 引擎给我的结果不同 jsperf 片段在这里
  • Keycloak 20.0.2:我在用户角色映射中没有看到领域角色

    当我在我的领域中创建用户并单击 角色映射 选项卡时 根据我看到的每个 SO 帖子 应该有一种方法来选择要应用的领域角色 但就我而言 我没有看到他们 This is what I see 我正在尝试添加manage users角色 因此我可以
  • 升级数据库

    我已经在谷歌商店中有一个应用程序 我正在使用一个有 3 个表的内置数据库 并在第一次启动应用程序时复制它 现在我想升级应用程序并添加另一个表 下面是我的代码 public DataBaseHelper Context context sup
  • 导入错误:没有名为 psycopg2 的模块

    在 OpenERP 6 的安装过程中 我想使用以下命令生成一个配置文件 cd home openerp openerp server bin openerp server py s stop after init c home opener
  • windows下如何设置keytool的密码?

    我正在为 android 应用程序开发的 my hello mapview 程序添加 google maps api 参考网站 http developer android com guide tutorials views hello m
  • 我需要处置 SemaphoreSlim 吗?

    根据文档 a SemaphoreSlim不使用 Windows 内核信号量 是否有任何特殊资源被使用SemaphoreSlim这使得打电话很重要Dispose当 的时候SemaphoreSlim将不再使用 如果您访问AvailableWai
  • Java中如何正确计算字符串的长度?

    我知道有String length以及其中的各种方法Character它或多或少适用于代码单元 代码点 Java 中实际返回 Unicode 标准指定的结果的建议方法是什么 UAX 29 http www unicode org repor
  • 保持 UI 响应的 Thread.Sleep 替代方案?

    我在 Visual Studio 2008 中使用 C 完成所有这些工作 我想放慢算法的工作速度 以便用户可以观看它的工作 GUI 上有可见的周期性变化 所以我添加了Thread Sleep每次实例之后 问题是Thread Sleep 当设
  • 赋值运算符的参数必须是引用吗?

    C 中重载类的赋值运算符时 其参数必须是引用吗 例如 class MyClass public MyClass operator const MyClass rhs 是真的吗 class MyClass public MyClass ope
  • 如何在 if 语句中使用 fork()

    有人可以向我解释一下是什么吗fork 0意思是 据我了解 我认为这意味着 fork 不是 false 吗 或者如果 fork 是 true 那么 我不明白 Fork 如何是 true 或 false 因为它只是将进程的副本创建到父进程和子进
  • 根据第一列中的字母数将行与上一行连接起来

    编码新手 试图弄清楚如何修复损坏的 csv 文件 以便能够正确使用它 因此 该文件已从案例管理系统导出 并包含用户名 案例 花费时间 注释和日期字段 问题在于 偶尔注释中会有换行符 并且在导出 csv 时 工具不包含引号来将其定义为字段内的
  • 在 GUI MATLAB 中为静态文本赋值

    如何在 MATLAB GUI 中为静态文本赋值 双击指南中的文本打开属性编辑器 然后编辑 String 财产 您还可以设置 Tag 属性 以便您可以在 GUI 运行时对其进行编辑 如果您将标签设置为mytext 您可以将静态文本更改为 My
  • 如何在 Python Qt 应用程序中使用 KDE Okular 的文档视图小部件?

    我正在 Linux 上使用 Qt 4 8 和 PyQt 用 Python 3 4 编写桌面应用程序 有没有办法将 Okular 的 pdf 查看功能作为小部件使用 导入 如果是 怎么办 这对我有用 import sys from PyKDE
  • 类型错误:这不是日期对象

    知道为什么这在 Chrome 中不起作用吗 var foo new Date getDate foo 我收到一个 TypeError 这不是 Date 对象 然而 new Date getDate works 该函数在您的示例中未正确绑定
  • 使用 Google Guice 注入 java 属性

    我想使用 google guice 使属性在我的应用程序的所有类中可用 我定义了一个加载并绑定属性文件的模块测试属性 Property1 TEST Property2 25 包com test import java io FileNotF