SeamFramework.orgCommunity Documentation
Wir haben bereits gesehen, wie das Web Beans Modell zur Dependency Einspeisung uns die Außerkraftsetzung der Implementierung eines API zum Zeitpunkt des Deployment gestattet. Das folgende Enterprise Web Bean zum Beispiel liefert eine Implementierung der API PaymentProcessor
in Production:
@CreditCard @Stateless
public class CreditCardPaymentProcessor
implements PaymentProcessor {
...
}
Aber in unserer Staging-Umgebung setzen wir diese Implementierung von PaymentProcessor
mit einem anderen Web Bean außer Kraft:
@CreditCard @Stateless @Staging
public class StagingCreditCardPaymentProcessor
implements PaymentProcessor {
...
}
Wir haben bei StagingCreditCardPaymentProcessor
versucht, AsyncPaymentProcessor
in einem bestimmten Deployment des Systems komplett zu ersetzen. In diesem Deployment, hätte der Deployment Typ @Staging
eine höhere Priorität als der standardmäßige Deployment Typ @Production
und daher Clients mit dem folgenden Einspeisungspunkt:
@CreditCard PaymentProcessor ccpp
Wir würden eine Instanz von StagingCreditCardPaymentProcessor
erhalten.
Leider könnten wir in gleich mehrere Fallen tappen:
Das Web Bean mit der höheren Priorität implementiert möglicherweise nicht alle API-Typen des Web Beans, das es außer Kraft zu setzen versucht,
Das Web Bean mit der höheren Priorität deklariert möglicherweise nicht alle Binding-Typen des Web Beans, das es außer Kraft zu setzen versucht,
Das Web Bean mit der höheren Priorität besitzt möglicherweise nicht denselben Namen wie das Web Bean, das es außer Kraft zu setzen versucht oder
das Web Bean, das es außer Kraft zu setzen versucht deklariert möglicherweise eine Producer Methode, eine Bereinigungsmethode odereine Observer Methode.
In allen diesen Fällen kann das Web Bean, das wir außer Kraft zu setzen versucht haben, nach wie vor zur Runtime aufgerufen werden. Daher ist Außerkraftsetzung anfällig für Entwicklerfehler.
Web Beans bieten ein spezielles Feature namens Specialization (Spezialisierung), das dem Entwickler hilft, diese Stolperfallen zu umgehen. Specialization wirkt auf den ersten Blick etwas ungewöhnlich, ist aber in der Praxis einfach zu verwenden und Sie werden die zusätzliche Sicherheit, die es bietet bald schätzen.
Specialization ist ein Feature das spezifisch für einfache und Enterprise Web Beans ist. Um Specialization zu nutzen, muss ein Web Bean mit höherer Priorität:
eine direkt Subklasse des Web Beans sein, das es außer Kraft setzt und
ein einfaches Web Bean sein, falls das Web Bean, das es außer Kraft setzt ein einfaches Web Bean ist oder ein Enterprise Web Bean sein, falls das Web Bean, das es außer Kraft setzt ein Enterprise Web Bean ist und
@Specializes
annotiert sein.
@Stateless @Staging @Specializes
public class StagingCreditCardPaymentProcessor
extends CreditCardPaymentProcessor {
...
}
Wir sprechen davon, dass das Web Bean mit höherer Priorität seine Superklasse spezialisiert.
Wann Spezialisierung eingesetzt wird:
DIe Binding-Typen der Superklasse werden automatisch durch das mit @Specializes
annotierte Web Bean geerbt und
der Web Bean Name der Superklasse wird automatisch automatisch durch das mit @Specializes
annotierte Web Bean geerbt und
durch die Superklasse deklarierte Producer-Methoden, Bereinigungsmethoden und Observer-Methoden werden durch eine Instanz des mit @Specializes
annotierten Web Beans aufgerufen.
In unserem Beispiel wird der Binding-Typ @CreditCard
von CreditCardPaymentProcessor
von StagingCreditCardPaymentProcessor
geerbt.
Desweiteren validiert der Web Bean Manager dies:
alle API-Typen der Superklasse sind API-Typen des mit @Specializes
annotierten Web Beans (alle lokalen Interfaces der Superklasse Enterprise Bean sind auch lokale Interfaces der Subklasse),
der Deployment-Typ des mit @Specializes
annotierten Web Bean besitzt Vorrang vor dem Deployment-Typ der Superklasse und
es existiert keun weiteres aktiviertes Web Bean, das ebenfalls die Superklasse spezialisiert.
Wird eine dieser Bedingungen verletzt, so meldet der Web Bean Manager zum Zeitpunkt der Initialisierung eine Ausnahme.
Wir können daher sicher sein, dass die Superklasse nie bei einem Deployment des Systems bei dem das mit @Specializes
annotierte Web Bean deployt und aktiviert wird, aufgerufen wird.