SeamFramework.orgCommunity Documentation

Capítulo 10. Estereótipos

10.1. Escopo padrão e o tipo de implantação para um estereótipo
10.2. Restringindo o escopo e o tipo com um estereótipo
10.3. Bindings de interceptadores para estereótipos
10.4. Padronização de nomes com estereótipos
10.5. Estereótipos padrões

De acordo com a especificação Web Beans:

Em muitos sistemas, a utilização de padrões arquiteturais produz um conjunto de papéis Web Bean recorrentes. Um estereótipo permite a um desenvolvedor de framwework identificar esse papel e declarar alguns metadados comums para Web Beans com esse papel em um local centralizado.

Um estereótipo encapsula qualquer combinação de:

  • um tipo padrão de implantação,

  • um tipo de escopo padrão,

  • uma restrição ao escopo do Web Bean,

  • uma exigência de que o Web Bean implemente ou estenda um certo tipo, e

  • um conjunto de anotações para binding de interceptadores

Um estereótipo também pode especificar que todos os Web Beans com o estereótipo têm um nome Web Bean padrão.

Um Web Bean pode declarar zero, um ou vários estereótipos.

Um estereótipo é um tipo de anotação Java. Esse estereótipo identifica classes de ação em algum framework MVC:

@Retention(RUNTIME)

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

Nós utilizamos o estereótipo, aplicando a anotação ao Web Bean.

@Action 

public class LoginAction { ... }

Um estereótipo pode especificar um escopo padrão e/ou um tipo padrão de implantação para Web Beans com esse estereótipo. Por exemplo, o tipo de implantação @WebTier identifica Web Beans que só deverão ser implantados quando o sistema executar como uma aplicação web. Podemos especificar os seguintes padrões para classes de ação :

@Retention(RUNTIME)

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

Evidentemente, uma determinada ação pode ainda,se necessário, substituir estes padrões:

@Dependent @Mock @Action 

public class MockLoginAction { ... }

Se quisermos forçar todas as ações para um escopo particular, podemos fazer isso também.

Suponha que queremos impedir as ações de declarar certos escopos. Web Beans permite-nos indicar explicitamente o conjunto de escopos permitidos para Web Beans com um certo estereótipo. Por exemplo:

@Retention(RUNTIME)

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

Se uma determinada classe de ação tenta especificar um escopo diferente do escopo de requisição da Web Beans, uma exceção será lançada pelo gerenciador do Web Bean em tempo de inicialização.

Também podemos forçar todos os Web Beans com um certo estereótipo a implementar uma interface ou estender uma classe:

@Retention(RUNTIME)

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

Se uma determinada classe de ação não estender a classe AbstractAction, uma exceção será lançada pelo gerenciador do Web Bean em tempo de inicialização.

Um estereótipo pode especificar um conjunto de interceptadores de bindings a serem herdados por todos os Web Beans com esse estereótipo.

@Retention(RUNTIME)

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

Isso nos ajuda a manter os detalhes técnicos ainda mais longe do código de negócios!

Por último, é possível especificar que todos os Web Beans com um certo estereótipo tenham um nome Web Bean padronizado pelo gerenciador do Web Bean. As ações são,muitas vezes, referenciadas em páginas JSP. Por isso, elas são um caso de utilização perfeito desse recurso. Tudo o que precisamos fazer é adicionar uma anotação @Nome vazia:

@Retention(RUNTIME)

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

Agora, LoginAction terá o nome loginAction.

Já conhecemos dois estereótipos padrões definidos pela especificação de Web Beans: @Interceptor e @Decorator.

Web Beans define mais um estereótipo padrão:

@Named 

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

Esse estereótipo é destinado ao uso com o JSF. Em vez de utilizar JSF managed beans, basta anotar um Web Bean com @Model, e utilizá-lo diretamente em sua página JSF.