SeamFramework.orgCommunity Documentation

Capitolo 10. Stereotipi

10.1. Scope di default e tipo di deploy per uno stereotipo
10.2. Restringere lo scope ed il tipo con uno stereotipo
10.3. Interceptor binding per gli stereotipi
10.4. Assegnare nomi di default con gli stereotipi
10.5. Stereotipi standard

Secondo la specifica Web Beans:

In molti sistemi l'uso di pattern architetturali produce un set di ruoli Web Bean ricorrenti. Uno stereotipo consente allo sviluppatore di framework di identificare tale ruolo e di dichiarare alcuni metadati comuni per i Web Bean con tale ruolo come parte principale.

Uno stereotipo incapsula qualsiasi combinazione di:

  • un tipo di deploy di default,

  • un tipo di scope di default,

  • una restrizione sullo scope del Web Bean,

  • un requisito che il Web Bean implementi o estenda un certo tipo, e

  • un set di annotazioni di interceptor binding.

Uno stereotipo può anche specificare che tutti i Web Beans con tale stereotipo abbiano nomi Web Bean di default.

Un Web Bean può dichiarare zero, uno o più stereotipi.

Uno stereotipo è un tipo di annotazione Java. Questo stereotipo identifica le classi di azione in alcuni framework MVC:

@Retention(RUNTIME)

@Target(TYPE)
@Stereotype
public @interface Action {}

Lo stereotipo viene impiegato applicando l'annotazione al Web Bean.

@Action 

public class LoginAction { ... }

Uno stereotipo può specificare uno scope di default e/o un tipo di deploy di default per Web Bean con tale stereotipo. Per esempio, se il tipo di deploy @WebTier identifica Web Bean che dovrebbero essere deployati quando il sistema viene eseguito come applicazione web, si potrebbero specificare i seguenti valori di default per le classi d'azione:

@Retention(RUNTIME)

@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype
public @interface Action {}

Certamente una particolare azione può comunque fare l'override di questi valore se necessario:

@Dependent @Mock @Action 

public class MockLoginAction { ... }

Se si vuole forzare tutte le azioni ad un particolare scope, è possibile.

Si supponga di voler prevenire le azioni dal dichiarare certi scope. Web Beans consente esplicitamente di specificare un set di scope consentiti per Web Bean con certi stereotipi. Per esempio:

@Retention(RUNTIME)

@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype(supportedScopes=RequestScoped.class)
public @interface Action {}

Se una particolare classe d'azione tenta di specificare uno scope diverso dallo scope di richiesta Web Bean, verrà lanciata un'eccezione dal manager Web Bean in fase di inizializzazione.

Tutti i Web Bean con certi stereotipi possono venire forzati ad implementare un'interfaccia o ad estendere una classe:

@Retention(RUNTIME)

@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype(requiredTypes=AbstractAction.class)
public @interface Action {}

Se una particolare classe d'azione non estende la classe AbstractAction, verrà lanciata un'eccezione dal manager Web Bean in fase di inizializzazione.

Uno stereotipo può specificare un set di interceptor binding da ereditare da tutti i Web Bean con quello stereotipo.

@Retention(RUNTIME)

@Target(TYPE)
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@WebTier
@Stereotype
public @interface Action {}

Questo aiuta ad ottenere concern tecnici anche lontano dal codice di business!

Infine è possibile specificare che tutti i Web Bean con certi stereotipi abbiamo un certo nome Web Bean, messo di default dal manager Web Bean. Le azioni sono spesso referenziate nelle pagine JSP, e quindi sono un caso d'uso perfetto per questa funzionalità. Basta aggiungere un'annotazione vuota @Named:

@Retention(RUNTIME)

@Target(TYPE)
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@Named
@WebTier
@Stereotype
public @interface Action {}

Ora, LoginAction avrà nome loginAction.

Si sono già visti due stereotipi standard definiti dalla specifica Web Bean: @Interceptor e @Decorator.

Web Bean definisce un ulteriore stereotipo standard:

@Named 

@RequestScoped 
@Stereotype 
@Target({TYPE, METHOD}) 
@Retention(RUNTIME) 
public @interface Model {} 

Questo stereotipo è inteso per l'uso con JSF. Invece di usare bean gestiti da JSF, basta annotare un Web Bean con @Model, e usarlo direttamente nelle pagine JSF.