SeamFramework.orgCommunity Documentation

Capítulo 14. Estendendo a Web Beans

14.1. O objeto Manager
14.2. A classe Bean
14.3. A interface Context

A Web Beans pretende ser uma plataforma para frameworks, extensões e integração com outras tecnologias. Portanto,a Web Beans expõe um conjunto de SPIs para a utilização pelos desenvolvedores de extensões portáveis para Web Beans. Por exemplo, os seguintes tipos de extensões estavam previstas pelos designers da Web Beans:

O nervo central para estender a Web Beans é o objeto Manager.

A interface Manager permite, programaticamente, registrar e obter Web Beans, interceptadores, decoradores, observadores e contextos.

public interface Manager

{
   public <T
> Set<Bean<T
>
> resolveByType(Class<T
> type, Annotation... bindings);
   public <T
> Set<Bean<T
>
> resolveByType(TypeLiteral<T
> apiType,
         Annotation... bindings);
   public <T
> T getInstanceByType(Class<T
> type, Annotation... bindings);
   public <T
> T getInstanceByType(TypeLiteral<T
> type,
         Annotation... bindings);
   public Set<Bean<?>
> resolveByName(String name);
   public Object getInstanceByName(String name);
   public <T
> T getInstance(Bean<T
> bean);
   public void fireEvent(Object event, Annotation... bindings);
   public Context getContext(Class<? extends Annotation
> scopeType);
   public Manager addContext(Context context);
   public Manager addBean(Bean<?> bean);
   public Manager addInterceptor(Interceptor interceptor);
   public Manager addDecorator(Decorator decorator);
   public <T
> Manager addObserver(Observer<T
> observer, Class<T
> eventType,
         Annotation... bindings);
   public <T
> Manager addObserver(Observer<T
> observer, TypeLiteral<T
> eventType,
         Annotation... bindings);
   public <T
> Manager removeObserver(Observer<T
> observer, Class<T
> eventType,
         Annotation... bindings);
   public <T
> Manager removeObserver(Observer<T
> observer,
         TypeLiteral<T
> eventType, Annotation... bindings);
   public <T
> Set<Observer<T
>
> resolveObservers(T event, Annotation... bindings);
   public List<Interceptor
> resolveInterceptors(InterceptionType type,
         Annotation... interceptorBindings);
   public List<Decorator
> resolveDecorators(Set<Class<?>
> types,
         Annotation... bindings);
}

Nós podemos obter uma instância do Manager via injeção:

@Current Manager manager

Instâncias da classe abstrata Bean representam Web Beans. Existe uma instância do Bean registrado com o objeto Manager para todos os Web Beans da aplicação.

public abstract class Bean<T> {

    
    private final Manager manager;
    
    protected Bean(Manager manager) {
        this.manager=manager;
    }
    
    protected Manager getManager() {
        return manager;
    }
    
    public abstract Set<Class> getTypes();
    public abstract Set<Annotation> getBindingTypes();
    public abstract Class<? extends Annotation> getScopeType();
    public abstract Class<? extends Annotation> getDeploymentType(); 
    public abstract String getName();
    
    public abstract boolean isSerializable();
    public abstract boolean isNullable();
    public abstract T create();
    public abstract void destroy(T instance);
    
}

É possível estender a classe Bean e registrar instâncias através da chamada Manager.addBean(), para fornecer suporte para novos tipos de Web Beans, além dos definidos pela especificação Web Beans (Web Beans simples e coporativos, métodos produtores e endpoints JMS). Por exemplo, poderíamos usar a classe Bean para permitir que os objetos gerenciados por um outro framework possam ser injetados nos Web Beans.

Existem duas subclasses de Bean definidas pela especificação de Web Beans: Interceptor e Decorator.

A interface Context suporta a adição de novos escopos a Web Beans, ou extensões dos escopos existentes para novos ambientes.

public interface Context {

    
    public Class<? extends Annotation> getScopeType();
    
    public <T> T get(Bean<T> bean, boolean create);
    
    boolean isActive();
    
}

Por exemplo, nós poderíamos implementar Context para adicionar um escopo de processo de negócios a Web Beans, ou para adicionar suporte ao escopo de conversação a uma aplicação que utiliza o Wicket.