【问题标题】:Is it possible to inject the class requesting injection using Guice?是否可以使用 Guice 注入请求注入的类?
【发布时间】:2012-01-27 01:05:10
【问题描述】:

我希望一个对象的注入实例知道请求其注入的类的名称。我知道这种违反了依赖注入的整个概念,但它似乎是支持有用日志记录的有效用例。 Guice 可以做到这一点吗?

例子:

class InjectorAware {
   @Inject
   public InjectorAware(Class injectorClass){
      System.out.println("I was injected into a "+injectorClass.getCanonicalName());
   }
}

class NeedsInjectorAwareField {
   @Inject InjectorAware injectorAware;
}

当 NeedsInjectorAwareField 被注入时,控制台会打印“我被注入了 somepackage.NeedsInjectorAwareField”

【问题讨论】:

    标签: java dependency-injection guice


    【解决方案1】:

    Guice 实际上已经为您injectsjava.util.logging.Logger 定制了它所注入的类的名称。不知道它是怎么做的,但你也许可以借用 Guice 源中使用的技术……或者直接使用 Logger。

    更新:this 似乎是负责此行为的 Guice 来源。你也许能以某种方式借用这项技术,我不确定。

    【讨论】:

    • 谢谢。我不只是在寻找一个记录器,但我会稍微挖掘一下代码,看看它是如何完成的。
    • ogregoire 提到的问题似乎是相关的,并表明这个技巧从外部是不可能的。
    【解决方案2】:

    只使用 Guice 是不可能的,他们不会允许的。

    http://code.google.com/p/google-guice/issues/detail?id=27

    【讨论】:

    • 嗯,这很糟糕。谢谢你的信息。
    【解决方案3】:

    不确定是否只能使用 Guice 来实现,但通过注入的构造函数使其工作不会太难。

    public interface InjectorAware {
      void setInjector(Object injectingInstance);
    }
    
    public class Foo {
    
      @Injected
      public Foo(InjectorAware injectorAware){
        injectorAware.setInjector(this);
      }
    
    }
    

    就是这么说的。不确定这是个好主意。

    【讨论】:

    • 这是一个解决方案,但出于我的目的,我希望注入类不必担心额外的步骤。感谢您的建议。
    【解决方案4】:

    我知道这是一个旧线程,但对于那些仍在尝试解决此问题的人,请查看https://github.com/raner/loginject

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多