gpt4 book ai didi

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

转载 作者:搜寻专家 更新时间:2023-10-30 19:42:35 24 4
gpt4 key购买 nike

我想使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com