Подтвердить что ты не робот

Скрытые особенности Google Guice

Google Guice предоставляет некоторые отличные функции впрыска зависимостей.

Недавно я встретил функцию @Nullable, которая позволяет отмечать аргументы конструктора как необязательные (разрешая нуль), поскольку Guice не разрешает их по умолчанию:

например.

public Person(String firstName, String lastName, @Nullable Phone phone) {
    this.firstName = checkNotNull(firstName, "firstName");
    this.lastName = checkNotNull(lastName, "lastName");
    this.phone = phone;
}

https://github.com/google/guice/wiki/UseNullable

Каковы другие полезные функции Guice (особенно менее очевидные), которые люди используют?

4b9b3361

Ответ 1

Ни один из них не предназначен для скрытия, но это мои любимые "бонусные функции" в Guice:

  • Guice может ввести TypeLiteral <T> , эффективно уничтожая стирание.
  • TypeLiteral может выполнять общее разрешение типа: это говорит вам, что get() в List <String> возвращает Iterator <String> .
  • Types является factory для реализаций интерфейсов общего типа Java.
  • Grapher визуализирует инжекторы. Если ваш пользовательский поставщик реализует HasDependencies, он может увеличить этот график.
  • Modules.override() невероятно удобен.
  • Короткий синтаксис для определения параметризованных ключей: new Key < List <String> gt;() {}.
  • Binder.skipSources() позволяет вам писать расширения, чьи сообщения об ошибках соответствуют номерам дорожек.
  • SPI. Элементы .getElements() разбивают модуль на атомы и Elements.getModule() ставит их вместе.
  • Если вы реализуете equals() и hashCode() в модуле, вы можете установить этот модуль несколько раз без проблем.

Ответ 2

Мне нравится, как полностью открыть интерфейс Scope: в основном это просто преобразование от Provider до Provider. (Хорошо, от Key и Provider до Provider)

Хотите, чтобы некоторые вещи были в основном Singleton, но перечитывались из базы данных каждые полчаса? Это легко сделать для этого. Хотите выполнить некоторые запросы в фоновом режиме и иметь область действия, которая означает "все фоновые запросы, запущенные с одного и того же HTTP-запроса"? Относительно легко написать, что Scope тоже.

Хотите охватить некоторые Key на вашем сервере во время тестов, чтобы он использовал отдельный экземпляр для каждого теста, который вы используете от клиента? (С тестом, передающим идентификатор теста в файле cookie или дополнительном HTTP-параметре) Это сложнее сделать, но это вполне возможно и поэтому кто-то уже написал это для вас.

Да, чрезмерное злоупотребление Scope приведет к тому, что Джесси начнет охотиться за кольями и чесночными гвоздиками, но его потрясающая гибкость может быть действительно полезной.

Ответ 3

Одна из замечательных особенностей Guice заключается в том, насколько легко он делает перехватчики методов реализации в любом Module, используя:

public void bindInterceptor(
    Matcher<? super Class<?>> classMatcher,
    Matcher<? super Method> methodMatcher,
    MethodInterceptor... interceptors);

Теперь любой метод, соответствующий methodMatcher в классе, соответствующем classMatcher в этой области Module, перехвачен interceptors.

Например:

bindInterceptor(
    Matchers.any(),
    Matchers.annotatedWith(Retryable.class),
    new RetryableInterceptor());

Теперь мы можем просто аннотировать любой метод с помощью @Retryable, а наш RetryableInterceptor может повторите попытку, если он терпит неудачу.