SeamFramework.orgCommunity Documentation
根据Web Bean规范:
在很多系统中,体系模式的使用会产生一套重复发生的Web Bean角色。一个模板允许一个框架开发者来识别这样的一个角色,并且在一个中心地方为拥有这个角色的Web Bean声明一些通用的元数据。
一个模板封装了下面的任何组合:
一个默认的部署类型,
一个默认的范围类型,
一个对于Web Bean范围的限制
一个Web Bean实现或者继承一个特定类型的需求,以及
一套拦截器绑定注释。
一个模板也可以指定所有使用这个模板的Web Bean拥有的默认的Web Bean名称。
一个Web Bean可以声明零个,一个或者多个模板。
一个模板其实就是一个Java注释类型。这个模板在一些MVC框架中识别动作类:
@Retention(RUNTIME)
@Target(TYPE)
@Stereotype
public @interface Action {}
我们注释来让Web Bean应用模板
@Action
public class LoginAction { ... }
一个模板可以为使用该模板的Web Bean指定一个默认的范围或者默认的部署类型。例如,如果@WebTier
部署类型识别那些只应该在系统作为一个Web应用运行时才应该部署的Web Bean,我们可以为动作类指定下面的默认值:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype
public @interface Action {}
当然,如果必要的话,一个特殊的动作类仍旧可以重载这些默认值:
@Dependent @Mock @Action
public class MockLoginAction { ... }
如果我们想要敬爱那个所有动作类强制在某个特殊的范围,我们也可以这样做。
假定我们希望那个通过特定的范围声明来阻止一个动作。Web Bean可以让我们显式地为使用特定模板的Web Bean指定一套允许的范围。例如:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype(supportedScopes=RequestScoped.class)
public @interface Action {}
如果一个特殊的动作类试图指定超越Web Bean请求范围的范围,Web Bean管理器在初始化时就会抛出一个异常。
我们也可以强制所有的使用特定模板的Web Bean实现一个接口或者继承一个类:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@WebTier
@Stereotype(requiredTypes=AbstractAction.class)
public @interface Action {}
如果一个特殊的动作类没有继承 AbstractAction
,Web Bean管理器会在初始化时抛出一个异常。
一个模板指定一套拦截器绑定让使用该模板的Web Bean继承。
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@WebTier
@Stereotype
public @interface Action {}
这将能够帮助我们从业务代码中剥离技术关注点!
最后,我们可以为所有使用模板的Web Bean指定一个Web Bean名称,Web Bean管理器将其设为默认名称。JSP页面中常常引用动作类,所以它们是这个特性的最好的例子。我们所需做的就是添加一个空的 @Named
注释:
@Retention(RUNTIME)
@Target(TYPE)
@RequestScoped
@Transactional(requiresNew=true)
@Secure
@Named
@WebTier
@Stereotype
public @interface Action {}
现在, LoginAction
将拥有一个名为 loginAction
Web Bean名称.