Guice - 使用静态帮助方法将依赖项注入类

8
我还不熟悉Guice,以前也没有使用过任何DI框架。在阅读官方wiki和许多其他文档后,我仍然无法完全理解它。
在我的特定情况下,我想编写一个EL标签库函数,该函数使用其他(要注入的)类。由于所有标签库函数都必须声明为静态的,因此我无法通过构造函数或setter来@Inject我的依赖项。我考虑使用requestStaticInjection()方法,该方法在http://code.google.com/p/google-guice/wiki/Injections#Static_Injections中描述,但我无法使其正常工作,并且一直找不到好的教程。
提前感谢任何帮助,
Arman

2
"我无法让它正常工作。那你尝试了什么?" - Jan Dörrenhaus
1个回答

20

Guice文档已经非常清晰明了了,但这里有一个单元测试可以展示如何使用静态注入的示例:

public class StaticInjectionExample {

  static class SomeClass {}

  static class TagLib{
    @Inject
    static SomeClass injected;

    public static void taglibFunction(String foo) {
      injected.something(foo);
    }

  }

  static class TestModule extends AbstractModule {
    @Override
    protected void configure() {
      requestStaticInjection(TabLib.class);
    }
  }

  @Test
  public void test() {
    Injector injector = Guice.createInjector(new TestModule());
    TagLib receiver = injector.getInstance(TagLib.class);
    // Do something with receiver.injected
  }
}

感谢condit的回复。我会尝试一下。 但是这样做会不会尊重其他注入器注入的依赖关系呢?例如,如果被注入的类已经标记为@Singleton,那么Guice会使用相同的实例吗? - Arman
我不确定你所说的“其他注入器”是什么意思。如果将 Injected 绑定为 @Singleton,则该单个实例将在整个模块中进行注入(包括静态注入)。 - condit
根据Guice文档,通常应在继承GuiceServletContextListener的ServletContextListener中创建一个注入器来完成web项目中的注入。因此,如果我在某个类中创建了一个额外的注入器,那么Guice是否会注入与“ServletContextListener-Injector”相同的@Singleton类? - Arman
我在GuiceServletContextListener中配置了注入器。但是,我如何从另一个类的静态方法中访问注入器?我通过将注入器在GuiceServletContextListener中声明为public static final来解决了我的问题,并以这种方式访问它。但我认为这几乎不是好的风格 :/ - Arman
为什么需要获取注入器?你不能在类中直接使用@Inject来获取所需的实例吗? - condit
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接