SeamFramework.orgCommunity Documentation
A especificação CDI define um estereótipo da seguinte forma:
Em muitos sistemas, a utilização de padrões arquiteturais produz um conjunto de papéis recorrentes de beans. Um estereótipo permite a um desenvolvedor de framework identificar esse papel e declarar alguns metadados comuns para beans com esse papel em um local centralizado.
Um estereótipo encapsula qualquer combinação de:
um escopo padrão, e
um conjunto de bindings de interceptadores.
Um estereótipo pode também especificar que:
todos os beans com o estereótipo possuem um nome padrão em EL, ou que
todos os beans com o estereótipo são alternativos.
Um bean pode declarar nenhum, um ou vários estereótipos. As anotações de estereótipo podem ser aplicadas a uma classe de bean ou a um método ou campo produtor.
Um estereótipo é uma anotação anotada com @Stereotype
que embrulha muitas outras anotações. Por exemplo, o seguinte estereótipo identifica classes de ação em algum framework MVC:
@Stereotype
@Retention(RUNTIME)
@Target(TYPE)
...
public @interface Action {}
Nós utilizamos o estereótipo ao aplicar a anotação a um bean.
@Action
public class LoginAction { ... }
Claro que precisamos aplicar algumas outras anotações ao nosso estereótipo, ou então, não adicionaríamos muito valor a ele.
Um estereótipo pode especificar um escopo padrão para todos os beans anotados com o estereótipo. Por exemplo:
@RequestScoped
@Stereotype
@Retention(RUNTIME)
@Target(TYPE)
public @interface Action {}
Uma determinada ação pode ainda substituir este padrão se necessário:
@Dependent @Action
public class DependentScopedLoginAction { ... }
Naturalmente que substituir um único padrão não é muito útil. Mas lembre-se, estereótipos podem definir mais do que apenas o escopo padrão.
Um estereótipo pode especificar um conjunto de vínculos a interceptadores a serem herdados por todos os beans com esse estereótipo.
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@Stereotype
@Retention(RUNTIME)
@Target(TYPE)
public @interface Action {}
Isso nos ajuda a manter os detalhes técnicos, como transações e segurança, ainda mais longe do código de negócio!
Podemos especificar que todos os beans com um certo estereótipo tenham um nome EL padronizado quando um nome não é explicitamente definido por este bean. Tudo o que precisamos fazer é adicionar uma anotação @Named
vazia:
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@Named
@Stereotype
@Retention(RUNTIME)
@Target(TYPE)
public @interface Action {}
Agora o bean LoginAction
terá o nome loginAction
por padrão.
Um estereótipo pode indicar que todos os beans em que está aplicado são @Alternative
s. Um estereótipo alternativo nos permite classificar beans por cenário de implantação.
@Alternative
@Stereotype
@Retention(RUNTIME)
@Target(TYPE)
public @interface Mock {}
Podemos aplicar um estereótipo alternativo para um conjunto inteiro de beans e ativá-los com apenas uma linha de código em beans.xml
.
@Mock
public class MockLoginAction extends LoginAction { ... }
Isto pode fundir sua mente um pouco, mas estereótipos podem declarar outros estereótipos, o que chamaremos de empilhamento de estereótipos. Você pode querer fazer isto se tiver dois estereótipos distintos que possuem seus próprios significados, mas em outra situação podem ter outro significado quando combinados.
Aqui vai um exemplo que combina os estereótipos @Action
e @Auditable
:
@Auditable
@Action
@Stereotype
@Target(TYPE)
@Retention(RUNTIME)
public @interface AuditableAction {}
Já conhecemos dois estereótipos padrão definidos pela especificação CDI: @Interceptor
e @Decorator
.
CDI define um estereótipo adicional, @Model
, que deverá ser usado frequentemente em aplicações web:
@Named
@RequestScoped
@Stereotype
@Target({TYPE, METHOD})
@Retention(RUNTIME)
public @interface Model {}
Em vez de utilizar managed beans JSF, basta anotar um bean com @Model
, e utilizá-lo diretamente em sua página JSF!