2013-05-14 9 views
8

Ich injiziere eine Spring-Managed Bean in eine abstrakte Klasse und es scheint, dass es nicht funktioniert. Hier ist eine Erklärung dessen, was ich tun, wenn es nicht genug ist, kann ich die Post bearbeiten und einige Code hinzufügen:inject Bohnen in eine abstrakte Klasse mit Frühling und Java ee 5

  1. implementieren, um die Java-Code - 1 abstrakte Klasse, 2 Klassen, die von ihm erben und die Bohne injiziert und in der abstrakten Klasse und damit von den Unterklassen verwendet werden.
  2. Definieren Sie die Bean in der Federkonfiguration.
  3. Definieren Sie die abstrakte Klasse und 2 Unterklassen in der Frühjahrskonfiguration.
  4. Definieren Sie die erste Bean als eine Eigenschaft der abstrakten Klasse Bean.

Ergebnis - es funktioniert nicht.

Dann habe ich versucht, die injizierte Bean aus der abstrakten Klasse in die zwei Unterklassen zu verschieben. Jetzt funktioniert es.

Also, habe ich etwas falsch gemacht, oder ist es theoretisch unmöglich, eine Bean in eine abstrakte Klasse mit Spring 3 und Java EE 5 zu injizieren?

Antwort

11

Ist es theoretisch unmöglich, eine Bean mit Spring 3 und Java EE 5 in eine abstrakte Klasse zu injizieren?

Dependency Injection geschieht auf einem Objekt, das nicht zu seiner Klasse gehört. Spring fügt Abhängigkeiten in verwaltete Beans ein, bei denen es sich um bereits von Spring instantiierte Objekte handelt. Da eine abstrakte Klasse nicht instanziiert werden kann, wäre es konzeptionell falsch, hier über DI nachzudenken.

Sie können eine nicht abstrakte Klasse auch als abstrakte Spring-Bean definieren, indem Sie das Attribut abstract=true dem Tag <bean> hinzufügen. Dies zeigt an, dass die Bean nicht instanziiert werden würde und als eine bloße Vorlage von Eigenschaften dienen würde, die andere Beans über die Bean-Vererbung verwenden können (was überhaupt nicht mit der Java-Vererbung zusammenhängt).

Auch in diesem Kontext (wenn Sie es konfiguriert haben) würde die Dependency Injection nur für die untergeordneten Beans und nicht für ihre Elternbohne erfolgen, da sie als abstrakt definiert wurde. (Hinweis: Es ist nicht obligatorisch, dass die übergeordnete Bean abstrakt ist, aber es ist sinnvoll, dies zu tun, wenn sie nur als eine Gruppe von allgemeinen Bean-Eigenschaften fungiert.)

+0

Danke für die Antwort. Aber ich habe gelesen, dass DI in abstrakten Klassen in Java EE 6 möglich ist, oder? – user1414745

+0

Die Eigenschaft, die injiziert wird, könnte in der abstrakten Klasse definiert werden, aber die Injektion würde nur auf einem Objekt stattfinden, was impliziert, dass es sich um ein Subklassenobjekt handelt. –