[Закрываются] скрытые функции Google Guice

Если вы используете хотя бы java 8, вы делаете следующее:

public void myMethod(MyObject obj, Consumer<MyObject> action) {
  for() {
    for() {
      if() {
        action.accept(obj)
      }
    }
  }
}

Теперь вы можете вызывать этот метод, передавая в него различные действия:

myMethod((obj) -> System.out.println(obj))

27
задан Jonathan 21 April 2015 в 16:16
поделиться

3 ответа

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

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

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

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

13
ответ дан Daniel Martin 28 November 2019 в 04:42
поделиться

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

  • Guice может вводить TypeLiteral , эффективно предотвращает стирание.
  • TypeLiteral может выполнять разрешение универсального типа : это говорит вам, что get () для List возвращает Iterator .
  • Типы - это фабрика для реализации интерфейсов универсальных типов Java.
  • Графер визуализирует форсунки. Если ваш пользовательский провайдер реализует HasDependencies , он может расширить этот график.
  • Modules.override () невероятно удобен в крайнем случае.
  • Краткий синтаксис для определения параметризованных ключей: new Key > () {}.
  • Binder.skipSources () позволяет писать расширения, сообщения об ошибках которых правильно отслеживают номера строк.
  • SPI . Elements.getElements () разбивает модуль на атомы, а Elements.getModule () объединяет их вместе.
  • Если вы реализуете equals () и hashCode () в модуле, вы можете без проблем установить этот модуль несколько раз.
39
ответ дан 28 November 2019 в 04:42
поделиться

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

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

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

Например:

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

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

12
ответ дан 28 November 2019 в 04:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: