#java #guice #thrift
#java #guice #бережливость
Вопрос:
Я только начал использовать Guice и, прочитав документы, просмотрев несколько книг и просмотрев доклад Google I / O 2009 года, я пытаюсь преобразовать проект thrift, который опирается на несколько глобальных структур данных. На данный момент они создаются при запуске сервера thrift и передаются обработчику при каждом запросе. Они также используются в каждой части кода! По сути, синглтоны.
Насколько я понимаю, лучше всего создать инжектор в вашем основном методе и загрузить все ваши модули один раз.
Я не уверен, как я должен использовать этот инжектор где-то еще в своем коде. Должен ли я обернуть его в одноэлементный класс и заполнить свой код
Injector injector = InjectorInstance.get();
ClassA obj = injector.getInstance(ClassA.class);
Или есть метод, о котором я не знаю
ClassA obj = Guice.getLastInjector().getInstance(ClassA.class);
Я также нашел рекомендацию обходить поставщиков, но я не уверен, насколько это лучше, чем передавать фактические структуры данных по стеку вызовов.
Если бы кто-нибудь мог объяснить рекомендуемый шаблон или, что еще лучше, направить меня в направлении хорошего проекта с открытым исходным кодом, который использует guice, я был бы благодарен!
Ответ №1:
Для Guice идея заключается в том, что у вас есть целый граф зависимостей, каждая из которых хранит ссылку на то, что ей нужно на протяжении всего срока службы:
class EntryPoint {
public static void main(String[] args) {
YourApp yourApp = Guice.createInjector(yourListOfModules())
.getInstance(YourApp.class);
yourApp.run();
}
}
class YourApp {
@Inject DependencyA dependencyA;
}
class DependencyA {
@Inject DependencyB dependencyB;
}
class DependencyB {
/** This is injected once, so you'll always only get the same instance. */
@Inject DependencyC dependencyC;
/** By injecting the provider, you can get multiple instances. */
@Inject Provider<DependencyD> dependencyD;
}
Guice заботится о подключении, поэтому YourApp и DependencyA не нужно беспокоиться о том, нужна ли DependencyB DependencyC или DependencyD. В этом смысле вы никогда не вызываете new
: Guice заботится о создании каждой @Inject
зависимости ed для вас, а затем предоставляет ее зависимости.
Если вы не подключились к своим зависимостям (т. Е. Вы все еще вызываете new
свой код), у вас больше не будет доступа к инжектору из созданного вручную класса. В этом случае вы можете использовать getInstance
или getProvider
и спрятать его в статическом поле. Guice также поможет вам сделать это с <a rel="noreferrer noopener nofollow" href="https:///google-guice.googlecode.com/git/javadoc/com/google/inject/Binder.html#requestStaticInjection(java.lang.Class…)» rel=»nofollow»>помощью requestStaticInjection, который не подходит для долгосрочного проектирования Guice, но может помочь вам работать с устаревшим кодом или переходить на Guice.
Комментарии:
1. Думаю, теперь я понял, что мне придется попробовать это, спасибо за отличное объяснение!