SeamFramework.orgCommunity Documentation

Capítulo 14. Extensión de Web Beans

14.1. El objeto Manager
14.2. La clase Bean
14.3. La interfaz Contexto

Web Beans pretende ser una plataforma para marcos, extensiones e integración con otras tecnologías. Por lo tanto, Web Beans expone una serie de SPI para el uso de desarrolladores de extensiones portátiles para Web Beans. Por ejemplo, las siguientes clases de extensiones fueron previstas por los diseñadores de Web Beans:

El centro nervioso para extender Web Beans es el objeto Manager.

La interfaz Manager nos permite registrar y obtener Web Beans, interceptores, decoradores, observadores y contextos en forma programada.

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);
}

Podemos obtener una instancia de Manager vía inyección:

@Current Manager manager

Instancias de clase abstracta Bean representan Web Beans. Hay una instancia de Bean registrada con el objeto Manager para cada Web Bean en la aplicación.

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);
    
}

Es posible extender la clase Bean y registrar instancias llamando a Manager.addBean() para proveer soporte a nuevas clases de Web Beans, además de los definidos por la especificación Web Beans (Web Beans sencillos y empresariales, métodos de productor y endpoints JMS). Por ejemplo, podríamos utilizar la clase Bean para permitir que los objetos sean administrados por otro marco que se inyecta en Web Beans.

Hay dos subclases de Bean definidas por la especificación de Web Beans: Interceptor y Decorador.

La interfaz Contexto soporta la adición de nuevos ámbitos a Web Beans, o extensión de los ámbitos incorporados a nuevos entornos.

public interface Context {

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

Por ejemplo, podríamos implementar Contexto para agregar un ámbito de proceso de negocio a Web Beans, o agregar soporte para el ámbito de conversación a una aplicación que utiliza Wicket.