4 Stimmen

Wie man den Lebenszyklus von Objekten mit Guice kontrolliert

Ich habe Guice-injected Objekte, die zwei Lebenszyklusmethoden haben bind() y unbind() . Die Methode bind() wird automatisch aufgerufen, nachdem das Objekt von Guice mit der folgenden kommentierten Methode instanziiert wurde:

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

Was ich tun möchte, ist, die Methode unbind() auf das alte (aktuelle) Objekt, bevor eine neue Instanz des Objekts von Guice erstellt wird. Wie kann ich das tun?

Vielen Dank im Voraus!

3voto

Tom Punkte 20670

Zunächst einmal würde ich nicht dazu raten, beliebige Methoden mit @Inject zu annotieren. Beschränken Sie es auf Konstruktoren und gelegentlich auf optionale Injektion und/oder Feldinjektion.

Was Sie vorhaben, klingt ein wenig seltsam, und ich bin mir nicht sicher, ob es genau das ist, was Sie wollen. Können Sie bitte mehr Hintergrundinformationen zu dem geben, was Sie zu tun versuchen, denn vielleicht ist ein anderer Ansatz besser. Es gibt definitiv einige Bedenken hier mit Thread-Sicherheit und wie Sie Referenzen verwalten.

Ausgehend von dem, was Sie beschrieben haben, würde ein Ansatz, wie ihn @meverett erwähnt hat, wahrscheinlich funktionieren. Wenn die Objekte, die Sie haben, sind Foo s, würde es etwa so aussehen.

// 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;
  }
}

Beachten Sie, dass Ihr @Unbound Foo Anbieter erzeugen würde Foo s, ohne spezielle Methoden aufzurufen. Die reguläre FooProvider behält den Überblick über den Status und entscheidet, wann bind() y unbind() die Instanzen. Bitte seien Sie vorsichtig, wie Sie mehrere Instanzen verwalten und sie mit mehreren Threads verwenden.

Außerdem, nur um das klarzustellen: Ich verwende @Unbound denn die Methoden, die Sie aufrufen wollen, heißen bind() y unbind() . Ich verwende "gebunden" nicht im Sinne von Guice.

Beachten Sie auch ... aus der Spitze von meinem Kopf bin ich ziemlich sicher, dass Provider als Singletons behandelt werden, so dass die Aufrechterhaltung der Zustand wie dies funktionieren wird. Wenn es nicht, könnten Sie offensichtlich nur eine Ebene der Indirektion mit einer Art von Singleton-Fabrik erstellen (aber das sollte nicht notwendig sein).

2voto

Richard Sitze Punkte 7886

In den vorangegangenen Antworten wurden bereits andere Anliegen angesprochen, daher möchte ich nur die Frage beantworten:

Netflix eingeführt Gouverneur auf Github im Jahr 2012 zu " Verbesserung von Google Guice zur Bereitstellung ... Lebenszyklusmanagement ". Es bietet Anmerkungen ( @PreConfiguration , @PostConstruct , @PreDestroy und andere), Scannen des Klassenpfads und automatisches Binden sowie weitere Funktionen. Bootstrapping ist ganz einfach.

0voto

meverett Punkte 921

Ich nehme an, Sie könnten einen Anbieter haben, der einen Verweis auf das aktuelle Objekt behält. Wenn Sie get auf den Anbieter aufrufen, würde er das letzte Objekt lösen, das neue konstruieren und den Verweis darauf speichern.

obwohl ich nicht wirklich sicher bin, warum Sie so etwas tun möchten, da andere Objekte theoretisch immer noch auf sie verweisen können

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X