2009-08-21 8 views
1

Ich habe eine "MessageQueue" -Klasse. Es ist einfach, Nachrichten in eine Warteschlange zu stellen. Beans, die die Möglichkeit haben, Nachrichten zu veröffentlichen, haben einfach eine MessageQueue-Eigenschaft und Spring kümmert sich darum, sie zu injizieren.Circular Dependency und Spring-powered Event Queue

Das Problem ist, dass viele Beans sich auch als Listener registrieren müssen. Die Liste der Listener-Beans kann nicht in die messageQueue eingefügt werden, da dies zu zirkulären Abhängigkeiten führen würde. Viele Beans in der Abhängigkeitskette müssen Nachrichten posten und/oder Nachrichten abhören.

Wie könnte dann eine Spring-basierte Nachrichtenwarteschlange so implementiert werden, dass sie keine zirkulären Abhängigkeiten enthält?

Antwort

0

Okay, ich machte mir Sorgen um etwas, das eigentlich in Ordnung war. Viele Dinge hängen tatsächlich von der Warteschlange ab, aber die Warteschlange selbst hängt von nichts ab. Es hat keine eigenen Abhängigkeiten und führt daher auch nicht zu zirkulären Abhängigkeitsproblemen. Es ist nur ein Blatt mit vielen Eltern. Dumm von mir :-)

0

Verwenden Sie Konstruktor- oder Setter-Injektion? Wenn Sie Setter-Injektion (autowired oder nicht) verwenden, dann geht es Ihnen gut. Spring kann zirkuläre Abhängigkeiten auflösen. Sie injiziert das Objekt nur, bevor es die Eigenschaften injiziert. Wenn Sie also ein solches Objekt injizieren, ist es am besten, es nicht im Setter zu verwenden. Wenn Sie eine Initialisierung durchführen müssen, verwenden Sie @PostConstruct oder die Schnittstelle InitiazlizingBean mit der Methode afterPropertiesSet().

+0

Die meisten meiner Bohnen verwenden Setter, aber zumindest ein paar sind Legacy und beide haben obligatorische Konstruktoren und kann nicht Frühling-bewusst sein, leider. Aber auf jeden Fall eine gute Idee! –

0

Wenn Sie eine Situation haben, die die Verschaltung von veralteten Legacy-Klassen mit Konstruktoren beinhaltet, die "Dinge tun", wie das Einrichten von Listenern, wickle ich normalerweise das Legacy-Wotsit in eine benutzerdefinierte Spring FactoryBean. Dies würde alle notwendigen Setter haben und nur das Zielobjekt instantiieren, wenn Spring die zirkulären Abhängigkeiten fertig verdrahtet hat.

Haben Sie keine Angst vor zirkulären Abhängigkeiten, Spring behandelt sie elegant, solange die Objekt-Instanziierung und Injektion ziemlich passiv ist. Nutzen Sie @PostConstruct und/oder InitializingBean, damit der Life-Zyklus von Spring die harte Arbeit für Sie erledigt.