SeamFramework.orgCommunity Documentation

章 14. 延伸 Web Bean

14.1. Manager 物件
14.2. Bean class
14.3. Context 介面

Web Bean 為架構的平台,它可用來進行其它技術的延伸與整合。因此,Web Bean 提供了一組讓 Web Bean 的 portable extension 開發人員可使用的 SPI。比方說,下列類型的延伸為 Web Bean 設計人員所設想的:

延伸 Web Bean 的神經中樞為 Manager 這個物件。

Manager 介面能讓我們程式性地註冊並取得 Web Bean、攔截器(interceptor)、裝飾器(decorator)、觀察器(observer),以及 context。

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 的一個 instance:

@Current Manager ��

Bean 這個 abstract class 的 instance 代表 Web Bean。應用程式中的每個 Web Bean 都會有個與 Manager 物件註冊的 Bean instance。

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

您可藉由調用 Manager.addBean() 來延伸 Bean class 並註冊 instance 以便提供較新、未經 Web Bean 規格定義(基本與企業級 Web Bean、producer method 以及 JMS 端點)的 Web Bean 上的支援。比方說,我們可使用 Bean class 來允許另一個架構所管理的物件被注入 Web Bean 之中。

Web Bean 規格定義了 Bean 的兩個 subclass:InterceptorDecorator

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 的應用程式新增對話功能上的支援。