SeamFramework.orgCommunity Documentation
Gemäß der Web Beans Spezifikation:
In vielen Systemen produziert die Verwendung architektonischer Muster einen Satz wiederkehrender Web Bean Rollen. Ein Stereotyp gestattet dem Entwickler eines Frameworks die Identifizierung einer solchen Rolle und die Deklaration einiger gemeinsamer Metadaten für Web Beans mit dieser Rolle an einer zentralen Stelle.
Ein Stereotyp beinhaltet eine beliebige Kombination von:
einem standardmäßigen Deployment-Typ,
einem standardmäßigen Geltungsbereich-Typ,
einer Einschränkung hinsichtlich des Geltungsbereichs des Web Beans,
einer Anforderung, dass das Web Bean einen bestimmten Typ implementiert oder erweitert und
einem Satz von Interzeptor Binding Annotationen.
Ein Stereotyp kann auch festlegen, dass alle Web Beans mit dem Stereotyp standardmäßige Web Bean Namen besitzen.
Ein Web Bean kann null, ein oder mehrere Stereotypen deklarieren.
Bei einem Stereotyp handelt es sich um einen Java Annotationstyp. Dieses Stereotyp identifiziert Action-Klassen in einem MVC-Framework:
@Retention(RUNTIME)
@Target(TYPE)
@Stereotype
public @interface Action {}
Wir verwenden das Stereotyp durch Anwendung der Annotation an einem Web Bean.
@Action
public class LoginAction { ... }
Ein Stereotyp kann den standardmäßigen Geltungsbereich und/oder standardmäßigen Deployment-Typ für Web Beans mit diesem Stereotyp festlegen. Identifiziert der Deployment-Typ @WebTier
etwa, dass Web Beans nur deployt werden sollten, wenn das System als eine Webanwendung ausgeführt wird, so könnten wird die folgenden Standards für Action-Klassen festlegen:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype
public @interface Action {}
Natürlich kann eine bestimmte Action diese Standards falls nötig immer noch außer Kraft setzen:
@Dependent @Mock @Action
public class MockLoginAction { ... }
Wenn wir alle Actions in einen bestimmten Geltungsbereich zwingen wollen, so können wir auch das tun.
Nehmen wir an, wir wollten verhindern, dass Actions bestimmte Geltungsbereiche deklarieren. Web Beans lässt uns den Satz gestatteter Geltungsbereiche für Web Beans mit einem bestimmten Stereotyp explizit festlegen. Zum Beispiel:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype(supportedScopes=RequestScoped.class)
public @interface Action {}
Falls eine bestimmte Action-Klasse versucht einen anderen Geltungsbereich als den Anfragen-Geltungsbereich der Web Beans festzulegen, so wird zum Initialisierungszeitpunkt durch den Web Bean Manager eine Ausnahme gemeldet.
Wir können auch alle Web Beans mit einem bestimmten Stereotyp zur Implementierung eines Interface oder Erweiterung einer Klasse zwingen:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype(requiredTypes=AbstractAction.class)
public @interface Action {}
Falls eine bestimmte Action-Klasse die Klasse AbstractAction
nicht erweitert, so wird zum Initialisierungszeitpunkt eine Ausnahme durch den Web Bean Manager gemeldet.
Ein Stereotyp kann einen Satz von Interzeptor-Bindings festlegen, der an alle Web Beans mit diesem Stereotyp vererbt werden soll.
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@WebTier
@Stereotype
public @interface Action {}
Dies hilft uns einen weiteren Schritt weiter in Richtung der Trennung technischer Probleme und Business Code!
Zu guter Letzt können wir auch noch festlegen, dass alle Web Beans mit einem bestimmten Stereotyp einen Web Bean Namen besitzen, der vom Web Bean Manager standardisiert wird. Actions werden oft in JSP-Seiten referenziert, so dass sie den perfekten Anwendungsfall für dieses Feature darstellen. Alles, was wir tun müssen ist eine leere @Named
-Annotation hinzuzufügen:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@Named
@WebTier
@Stereotype
public @interface Action {}
Jetzt hat LoginAction
den Namen loginAction
.
Wir haben bereits zwei Standard-Stereotypen kennengelernt, die durch die Web Beans Spezifikation definiert werden: @Interceptor
und @Decorator
.
Web Beans definiert einen weiteren Standard-Stereotyp:
@Named
@RequestScoped
@Stereotype
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface Model {}
Dieser Stereotyp ist für den Gebrauch mit JSF vorgesehen. Statt JSF gemanagte Beans zu verwenden, annotieren Sie ein Web Bean einfach @Model
, und verwenden Sie es direkt in Ihrer JSF-Seite.