Я новичок в Google Guice и понимаю концепцию Dependency Injection концептуально, но я сталкиваюсь с проблемами, пытаясь включить его в мое приложение. Мой конкретный вопрос касается объектов Singleton. Вот пример:Guice Singleton Static Injection Pattern
Во-первых, мой класс модуля, который связывает тяжелый интерфейс Singleton Connection с его реализацией.
public class MyModule extends AbstractModule {
@Override
protected void configure() {
bind(Connection.class).to(MyConnection.class).asEagerSingleton();
}
}
Сейчас, на мой основной метод, я создаю экземпляр моего сервера приложений и впрыснуть Connection:
public class MyApplication {
@Inject
public MyApplication(Connection cxn) {
}
public static void main(String[] args) {
Injector injector = Guice.createInjector(new MyModule());
MyApplication app = injector.getInstance(MyApplication.class);
// Start application, add ShutdownHook, etc...
}
}
Все, что хорошо до сих пор ... Теперь у меня есть некоторые классы DAO, которые используют мой объект Connection , но извлекаются со статическими методами следующим образом:
public class MyConfiguration {
private Config conf;
private Connection cxn; // Would like to have this injected
private MyConfiguration(Config conf) {
this.conf = conf;
}
public static MyConfiguration getConfig(String name) {
return new MyConfiguration(cxn.getConfig(name));
}
}
Моего первым предположением было то, что я бы просто добавить @Inject
к cxn
, но это не ж ork, потому что я не получаю экземпляр от Guice; это просто дает мне NPE. Как я понимаю, у меня есть 2 варианта для получения объекта Connection:
- Expose метод
getConnection()
в MyApplication по существу после Service Locator Pattern - Добавить
requestStaticInjection(MyConfiguration)
вMyModule
Я выбрал # 2 , однако docs say:
Этот API не рекомендуется для общего использования
Какова наилучшая практика для предоставления моего Singleton классам, которые в нем нуждаются, без необходимости проходить через Injector.getInstance
каждый раз? Что мне не хватает?
Вы сказали это сам, изменить способ быть нестатическими;) – alfasin
Я согласен с @alfasin причина, по которой вы теряете одну из основных причин делать DI, если у вас есть статические вызовы, которые нельзя вводить по-разному. Почему вы не использовали одиночный шаблон non DI для MyConfiguration? – JasonOfEarth
Мой пример несколько надуман для объяснения. В моем приложении «Конфигурация» на самом деле является соединением базы данных Graph. Cxn.getConfig - это фактически обход графика, который находит узел с заданным именем. Объект MyConfiguration является оберткой вокруг этого узла, предоставляющей информацию о конкретном домене. Я планировал использовать его в бегстве: MyConfiguration.getConfig («x»). GetName() и т. Д. Предположим, я удалил экземпляр статического объекта, мне пришлось бы использовать Injector.getInstance по всему моему коду всякий раз, когда мне нужно было ? Как обрабатывать параметры конструктора, которые нельзя вводить? – lamarvannoy