java - 使用 Google Guice 注入(inject) java 属性

标签 java properties guice

我想使用 google guice 使属性在我的应用程序的所有类中可用。我定义了一个加载和绑定(bind)属性文件 Test.properties 的模块。

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");
    }

    }
}

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

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 创建了其他类,我也需要在其中注入(inject)属性,而这些类也需要注入(inject)属性,那么正确的方法是什么?

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

  2. 像这样实例化一个新的注入(inject)器

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

在所有嵌套类中?

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

最佳答案

Pass the injector to all subclasses and then use injector.getInstance(...) to create the subclasses?

不,这样做你会破坏 dependency injection 的目的模式并将所有实现耦合到 Guice。您的实现不应与 guice 交互,除非通过(现已标准化的)注释。

Instanciate a new injector like

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

in all nested classes?

不,这更糟糕,因为你最终会得到多个注入(inject)器,因此多个上下文会阻止 scopes 的正确使用。 .

理想情况下,您应该只在应用程序的引导过程中使用注入(inject)器。当然,引导它的方式在很大程度上取决于应用程序。

Is there an other approach to make the properties available in all classes?

可以像为 TestImpl 那样注入(inject)属性。 如果您希望 TestImpl 使用一个服务,它也需要一些属性(或其他服务),只需让 Guice 将它注入(inject) TestImpl。 Guice 负责所有的实例化/连接。当 Guice 自己无法解决这个问题时,您应该只通过使用 Binder 告诉 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;
        }
    }
}

关于java - 使用 Google Guice 注入(inject) java 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9772557/

相关文章:

Java 正则表达式组 OR 运算符

java - 执行缓慢并且耗尽堆空间(即使 vm args 设置为 2g)

python - 为什么属性 setter 无法正常工作?

iphone - 使用谓词过滤数组中对象的属性

java - 关闭 Quartz 调度程序

linux - Linux 的 Oracle JDK 链接是否断开?

java - 如何获取首页URL链接

ant - 如何覆盖Ant中的属性?

java - 将类对象注入(inject)另一个类中,而不将其添加到构造函数中

java - 如何使用 ServletScopes.scopeRequest() 和 ServletScopes.continueRequest()?