SeamFramework.orgCommunity Documentation
Web Beans意图成为框架的平台,扩展的平台,和能够与其他技术整合的平台。因此,Web Bean将一套SPI暴露给开发者,从而能够让他们便于扩展Web Bean。例如,下面是Web Bean设计者设想的扩展类型:
整合业务流程管理引擎,
整合第三方框架,例如Spring, Seam, GWT或者Wicket,和
基于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
的子类:拦截器
和 装饰器
。