当前位置: 首页 > 知识库问答 >
问题:

如何使用 guice 注入在具有静态方法的类中注入类?

云鸿祯
2023-03-14

我是Guice注入的新手。如何将类注入到将在静态方法中使用的静态变量中?

这是我想在 doLocalize() 方法中使用注入的变量 b 的类。

public class A {
   @Inject //Trying to inject this class
   private static B b;

   // Private constructor to prevent initialization.
   private A() {}

   public static String doLocalize(String word) {
       return b.localize(word);
   }
}

这是我想要对其执行guice注入的模块类。

注意:我不能改变我的模块和B类,因为它来自另一个依赖项。

public class MyModule extends AbstractModule {
   public void configure() {
       bind(B.class);
       // some other binds
   }

}

我想在我的A类中注入的类

public class B {
    public String localize(String word) {
        //does some stuff
        //returns a modified string
    }
}

共有2个答案

封昊天
2023-03-14

出于几个原因,我建议将A上的方法设置为非静态的。

  • 很难单元测试调用引用外部服务的静态方法的代码
  • 使用静态状态会使您的代码更难线程安全
  • 静态字段有时会导致内存泄漏

我建议:

public class A {
   private final B b;

   @Inject
   private A(B b) {
     this.b = b;
   }

   public String doLocalize(String word) {
       return b.localize(word);
   }
}

请注意,b是final,这很好,因为您不希望它是更改,并且final字段在多线程环境中有一定的保证。

写完这篇文章后,我想知道为什么需要A类。相反,任何代码都可以调用<code>A。doLocalize()注入Binstance?

颜熙云
2023-03-14

使用 requestStaticInjection。这在维基中有描述。

注意:我不能改变我的模块和B类,因为它来自另一个依赖项。

那么你将需要一个新的模块。

class A {
    @Inject
    public static B b;
    static void a(){b.b();}
}
class B {
    @Inject public PrintStream out;
    void b() { out.println("Value: b"); }
}

class MyModule extends AbstractModule {
    public void configure() {
        bind(B.class);
        bind(PrintStream.class).toInstance(System.out);
    }
}

class AModule extends AbstractModule {
    public void configure() {
        requestStaticInjection(A.class);
    }
}

@Test
public void test() {
    Guice.createInjector(new AModule(), new MyModule()); // Can be in any order
    A.a();
    assertThat(A.b, is(not(nullValue())));
}
 类似资料:
  • 问题内容: 我想知道用google guice注入实用程序方法是否是一种好的样式。 假设我们有一个Converter Utility类: 我的想法是使用guice将这个Utility像Singleton这样注入 建议使用guice构建的应用程序采用哪种方式? 问题答案: 这取决于您的方法的性质。 如果有的话 简单 确定性的(即不依赖于其他参数) 没有副作用 不太可能改变 等等 您可以将其保留为静态

  • 我正在努力实现DI,特别是使用guice的构造函数注入。我很难理解如何将泛型的类类型注入到构造函数中。 我的课程如下: 我可以在运行时使用guice将类的类型注入构造函数吗?简而言之,我可以使用guice注入Foo构造函数吗?

  • 主要内容:Google Guice 方法注入 示例,输出注入是将依赖注入对象的过程。方法注入用于将值对象设置为对象的依赖项。请参阅下面的示例。 Google Guice 方法注入 示例 创建一个名为 GuiceTester 的 Java 类。 输出 编译并运行该文件,您将看到以下输出。

  • 我是Google Guice的新手,从概念上理解依赖注入,但在尝试将其并入我的应用程序时遇到了一些问题。我的具体问题是关于单例对象的。这里有一个例子: 首先是我的模块类,它将一个沉重的单例连接接口绑定到它的实现。 现在,在我的main方法中,我实例化我的应用程序服务器并注入连接: 到目前为止一切顺利...现在,我有一些利用连接对象的DAO类,但使用静态方法检索,如下所示: 我的第一个假设是,我只需

  • 问题内容: 我是Spring的新手,遇到了这个问题。我尝试在该方法上使用@Autowired,但没有成功,在变量上,我从Eclipse中收到错误消息“该位置不允许使用@Autowired注解”。我在xml中创建了所需的bean。 下面是代码,此方法在抽象类内。 (ps我是stackOverflow的新手,希望我正确格式化了问题:)) 问题答案: 如果有可能可以让你把和成静态属性可以通过利用注入他们

  • 问题内容: 我正在尝试使用Guice注入通用类型。我的Repository 位于Cursor类中。 因此,当我创建Cursor 时,我还希望Guice将我的存储库注入Repository 。有没有办法做到这一点? 问题答案: 您必须使用: 要获取的实例,则需要: 在FAQ中有更多细节。