即使我已将范围类型指定为方法,它也会在CONVERSATION范围内实例化。
> UserHome userHome =(UserHome)Component.getInstance(UserHome.class,ScopeType.METHOD);
这很令人困惑,有人可以解释这种行为吗?
答案 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
注释。