组件实例化如何在范围类型方面起作用

时间:2010-10-14 16:32:52

标签: seam

即使我已将范围类型指定为方法,它也会在CONVERSATION范围内实例化。

  

>   UserHome userHome =(UserHome)Component.getInstance(UserHome.class,ScopeType.METHOD);

这很令人困惑,有人可以解释这种行为吗?

2 个答案:

答案 0 :(得分:2)

致电时

Component.getInstance(UserHome.class, ScopeType.METHOD);

Seam的内部行为是调用

Object result = Contexts.lookupInStatefulContexts(name);

lookupInStatefulContexts API说

  

按以下顺序在所有上下文中搜索命名属性:方法,事件,页面,对话,会话,业务流程,应用程序。

由于您的ScopeType.METHOD不包含您的UserHome.class组件,搜索继续进行直到获取其范围(StypeType.CONVERSATION,对吗?)

<强>更新

  

我的印象是,如果您将ScopeType指定为 getInstance方法,您将能够在该范围内创建对象

如果目标组件没有关联所需的范围,则getInstance方法不会在该范围内创建组件。相反,它使用Contexts.lookupInStatefulContexts执行分层搜索,直到获得一些指定的范围

如果您希望将一个以上的范围分配给某个组件,您必须使用@Role(@Roles)注释对其进行区分

@Name("user")
@Scope(ScopeType.EVENT)
@Role(name="loggedUser", scope=ScopeType.SESSION)
public class User { ... }

所以你指定了所需的范围

Component.getInstance(User.class, ScopeType.EVENT);

Component.getInstance(User.class, ScopeType.SESSION);

请记住Seam 按字段/属性名称执行查找

private @In User user; // Take ScopeType.EVENT as scope

private @In User loggedUser; // Take ScopeType.SESSION as scope

答案 1 :(得分:1)

我假设你的UserHome课程扩展了Seam的EntityHome课程。 EntityHome的超级Home位于ScopeType.CONVERSATION范围内:

@Scope(ScopeType.CONVERSATION)
public abstract class Home<T, E> extends MutableController<T>

如果其中一个超级类已经有UserHome注释,则您没有覆盖@Scope声明中的范围,或者Seam会忽略子类中的@Scope注释。