SeamFramework.orgCommunity Documentation

第 14 章 扩展Web Bean

14.1. Manager 对象
14.2. Bean
14.3. Context 接口

Web Beans意图成为框架的平台,扩展的平台,和能够与其他技术整合的平台。因此,Web Bean将一套SPI暴露给开发者,从而能够让他们便于扩展Web Bean。例如,下面是Web Bean设计者设想的扩展类型:

扩展Web Bean的神经中枢是 Manager 对象。

Manager 接口能够让我们通过编程来注册和获得Web Bean,拦截器,装饰器,观察者和上下文。

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

我们可以通过注入来获得一个 Manager 实例:

@Current Manager manager

抽象类 Bean 的实例代表Web Bean。应用中的每个Web Bean都有一个在 Manager 注册的 Bean 实例。

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

我们可以继承 Bean 类,通过调用 Manager.addBean() 方法注册实例,从而提供超出Web Bean规范之外(简单Web Bean, 企业WebBean, 生产者方法和JMS端点)的新的Web Bean类型。例如,我们可以使用 Bean 类来允许其他框架管理的对象能够注入到Web Bean中。

Web Bean规范定义了两种 Bean 的子类:拦截器装饰器

Context 接口支持向Web Bean中添加新的范围,或者在新的环境中扩展内置的范围。

public interface Context {

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

例如,我们可以实现 Context ,向Web Bean添加一个业务流程范围,或者向使用Wicket框架的应用添加对对话的支持。