日期:2014-05-16  浏览次数:20310 次

转JSF注解seam

Chapter 27. Seam注解 -seam满江红

编写Seam应用程序时需要使用大量的注解。Seam让我们使用注解获得声明式编程风格。大部分注解由EJB3.0规范定义。 数据验证通过Hibernate Validator包定义。最后,Seam定义了它自己的注解集合,这就是我们这一章将要描述的。

所有这些注解在 org.jboss.seam.annotations 包中定义。

27.1. 用于定义组件的注解

我们要看的第一组注解让我们定义一个Seam组件。这些注解在组件(component)类中出现。

@Name
@Name("componentName")

为一个类定义一个Seam组件。所有Seam组件都需要该注解。

@Scope
@Scope(ScopeType.CONVERSATION)

定义默认的组件上下文。可以定义的值由 ScopeType 枚举:EVENT, PAGE, CONVERSATION, SESSION, BUSINESS_PROCESS, APPLICATION, STATELESS。

当范围没有显式定义时,默认的范围取决于组件类型。 对于无状态会话bean,默认是 STATELESS。 对于Entity Bean和Stateful Session Bean,默认是 CONVERSATION。 对于JavaBean,默认是 EVENT。

@Role
@Role(name="roleName", scope=ScopeType.SESSION)

允许一个Seam组件绑定多个上下文变量。 @Name/@Scope 注解定义一个“默认角色”。每一个 @Role 注解定一个附加角色。

  • name — 上下文变量的名字。

  • scope — 上下文变量的作用域。当没有显式定义作用域时,和上面一样默认取决于组件类型。

@Roles
@Roles({        @Role(name="user", scope=ScopeType.CONVERSATION),        @Role(name="currentUser", scope=ScopeType.SESSION)    })

允许指定多个额外角色。

@BypassInterceptors
@BypassInterceptors

取消在特定组件或者一个组件方法上的所有拦截器。

@JndiName
@JndiName("my/jndi/name")

Seam查找EJB组件的JNDI名。 如果没有显式指定JNDI名,Seam将使用由 org.jboss.seam.core.init.jndiPattern 指定的JNDI模式。

@Conversational
@Conversational

声明一个对话作用域组件是对话式的,亦即只有长期运行的对话处于活动状态时,组件中的方法才可以被调用。

@Startup
@Scope(APPLICATION) @Startup(depends="org.jboss.seam.bpm.jbpm")

指定某个Application Scope的组件在初始化时立即启动。它主要用于特别的内置组件,用于引导象JNDI,数据源等等关键性的设施。

@Scope(SESSION) @Startup

指定某个Session Scope的组件在Session建立时立即启动。

  • depends — 依赖于,指定必须在此之前启动的命名组件(如果已安装)。

@Install
@Install(false)

指定组件是否应该被默认安装。没有@Install注解则表明该组件应该被安装。

@Install(dependencies="org.jboss.seam.bpm.jbpm")

如果所指定的依赖组件被安装,那么该组件才安装。

@Install(genericDependencies=ManagedQueueSender.class)

如果所指定的类的某个实现组件被安装,那么该组件才安装。当无法确定依赖组件的唯一公开名字时,这就有用了。

@Install(classDependencies="org.hibernate.Session")

如果所指定的类在classpath中,那么该组件才安装。

@Install(precedence=BUILT_IN)

指定组件的优先级别。如果具有相同名字的多个组件存在,具有高优先级的才被安装。定义的优先级是(递增排序):

  • BUILT_IN — 所有内置的Seam组件的优先级别

  • FRAMEWORK — 用于扩展Seam的框架组件的优先级别

  • APPLICATION — 应用程序的组件优先级别(默认优先级)

  • DEPLOYMENT — 在特定部署中重载应用程序组件的组件优先级别

  • MOCK — 在测试时mock对象使用的优先级别

@Synchronized
@Synchronized(timeout=1000)

如果组件被多个客户端并发访问,Seam应该串行化请求。如果一个请求在给定时间段内没有得到组件的锁,将抛出一个例外。

@ReadOnly
@ReadOnly

声明JavaBean组件或者组件方法在调用结束时不要求状态复制。

@AutoCreate
@AutoCreate

声明组件将被自动建立,即使客户端不定义 create=true。

27.2. 用于双向注入的注解

下面两个注解控制双向注入。这些属性用于组件实例变量或者属性访问方法中。

@In
@In

在每次组件调用开始时,从上下文变量注入此组件属性。如果上下文变量是null,那么一个异常将被抛出。

@In(required=false)

在每次组件调用开始时,从上下文变量注入此组件属性。上下文变量可为null。

@In(create=true)

在每次组件调用开始时,从上下文变量注入此组件属性。如果上下文变量为null,那么Seam实例化这个组件。

@In(value="contextVariableName")

显式指定上下文变量的名字,而不再使用注解定义的实例变量名。

@In(value="#{customer.addresses['shipping']}")

在每次组件调用开始时,用一个JSF EL表达式的计算结果来注入组件属性。

  • value — 指定上下文变量名。默认是组件属性名。可选地,指定一个JSF EL表达式,放在 #{...} 符号中。

  • create — 指定若上下文变量名在所有上下文中均未定义,Seam应该创建一个组件作为上下文变量,名字即为所要求的名字。默认为false。

  • required — 指定若上下文变量名在所有上下文中均未定义,Seam应抛出异常。

@Out