Можно ли внедрить класс, запрашивающий инъекцию, используя Guice? - PullRequest
2 голосов
/ 27 января 2012

Мне бы хотелось, чтобы внедренный экземпляр объекта знал имя класса, который запрашивает его внедрение.Я знаю, что этот вид нарушает всю концепцию внедрения зависимостей, но это похоже на действительный вариант использования для поддержки полезного ведения журнала.Возможно ли это с Guice?

Пример:

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

class NeedsInjectorAwareField {
   @Inject InjectorAware injectorAware;
}

Когда NeedsInjectorAwareField будет введен, консоль выдаст сообщение «Я был введен в некоторый пакет.

Ответы [ 4 ]

4 голосов
/ 27 января 2012

Guice на самом деле уже внедряет a java.util.logging.Logger для вас, для которого уже настроено имя класса, в который он внедрен Не уверен, как это сделать, но вы можете позаимствовать технику из источника Guice ... или просто использовать Logger напрямую.

ОБНОВЛЕНИЕ: этот представляется точкой источника Guice, ответственного за это поведение. Возможно, вы сможете позаимствовать эту технику, я не уверен.

2 голосов
/ 27 января 2012

Невозможно использовать только Guice, и они этого не допустят.

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

1 голос
/ 14 мая 2015

Я знаю, что это старая тема, но для тех, кто все еще пытается решить эту проблему, взгляните на https://github.com/raner/loginject

1 голос
/ 27 января 2012

Не уверен, что вы могли бы сделать это только с Guice, но было бы не сложно заставить его работать с помощью инжектированных конструкторов.

public interface InjectorAware {
  void setInjector(Object injectingInstance);
}

public class Foo {

  @Injected
  public Foo(InjectorAware injectorAware){
    injectorAware.setInjector(this);
  }

}

Это сказал. Не уверен, что это хорошая идея.

...