Как контролировать жизненный цикл объекта с помощью Guice - PullRequest
2 голосов
/ 24 июня 2011

У меня есть объекты с введением Guice, у которых есть два метода жизненного цикла bind() и unbind().Метод bind() вызывается автоматически после создания экземпляра объекта Guice с использованием следующего аннотированного метода:

@Inject
final void autoBind() {
    bind();
}

Я хочу вызвать метод unbind() для старого (текущего) объекта до того, какновый экземпляр объекта создан Guice.Как мне это сделать?

Заранее спасибо!

Ответы [ 3 ]

2 голосов
/ 26 июня 2011

Прежде всего, я бы не советовал просто аннотировать произвольные методы с помощью @Inject. Сохраняйте его для конструкторов, а иногда и для дополнительного ввода и / или полевого ввода.

То, что вы пытаетесь сделать, звучит немного странно, и я не уверен, что это именно то, что вы хотите. Не могли бы вы предоставить больше информации о том, что вы пытаетесь сделать, потому что, возможно, другой подход лучше. Здесь определенно есть некоторые проблемы с безопасностью потоков и с тем, как вы управляете ссылками.

Исходя из того, что вы описали, подход, подобный тому, что упоминал @meverett, вероятно, будет работать. Если у вас есть объекты Foo s, это будет выглядеть примерно так:

// Later on be sure to bind(Foo.class).toProvider(FooProvider.class);
final class FooProvider implements Provider<Foo> {
  private final Provider<Foo> unboundFooProvider;

  private Foo currentInstance;

  @Inject FooProvider(@Unbound Provider<Foo> unboundFooProvider) {
    this.unboundFooProvider = unboundFooProvider;
  }

  @Override public Foo get() {
    if (currentInstance != null) {
      currentInstance.unbind();
    }
    currentInstance = unboundFooProvider.get();
    currentInstance.bind();
    return currentInstance;
  }
}

Обратите внимание, что ваш @Unbound Foo провайдер сгенерирует Foo s без вызова каких-либо специальных методов. Обычный FooProvider отслеживает состояние и решает, когда bind() и unbind() экземпляры. Пожалуйста, будьте осторожны с тем, как вы управляете несколькими экземплярами и используете их с несколькими потоками.

Кроме того, просто для ясности: я использую @Unbound, поскольку методы, которые вы хотите вызвать, называются bind() и unbind(). Я не использую «связанный» в смысле Guice.

Также обратите внимание ... на макушке головы я почти уверен, что провайдеры рассматриваются как одиночные, поэтому поддержание такого состояния будет работать. Если этого не произойдет, вы, очевидно, можете просто создать уровень косвенности с какой-то синглтон-фабрикой (но в этом нет необходимости).

1 голос
/ 29 августа 2016

Предыдущие ответы хорошо решают другие проблемы, поэтому просто отвечу на вопрос:

Netflix представил регулятор в github в 2012 году, чтобы " улучшил Google Guice, чтобы обеспечить ... управление жизненным циклом".Он предоставляет аннотации (@PreConfiguration, @PostConstruct, @PreDestroy и другие), сканирование пути к классам и автоматическое связывание, а также другие функции. Самозагрузка прямо вперед.

0 голосов
/ 25 июня 2011

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

, хотя я не совсем уверен, почему вы захотите сделать что-то подобное, поскольку другие объектыможет в теории все еще ссылаться на него

...