即使我已將範圍類型指定爲方法,它也會在CONVERSATION範圍內實例化。組件實例如何與範圍類型配合工作
> USERHOME USERHOME =(USERHOME)Component.getInstance(UserHome.class,ScopeType.METHOD);
這很混亂,有人可以解釋這種行爲嗎?
即使我已將範圍類型指定爲方法,它也會在CONVERSATION範圍內實例化。組件實例如何與範圍類型配合工作
> USERHOME USERHOME =(USERHOME)Component.getInstance(UserHome.class,ScopeType.METHOD);
這很混亂,有人可以解釋這種行爲嗎?
當你調用
Component.getInstance(UserHome.class, ScopeType.METHOD);
煤層內部行爲是調用
Object result = Contexts.lookupInStatefulContexts(name);
lookupInStatefulContexts API說
搜索所有上下文中的一個名爲屬性,按以下順序:方法,事件,頁面,會話,會話,業務流程,應用程序。
當你的ScopeType.METHOD不包含您UserHome.class組件,搜索下去,直到獲得其範圍(StypeType.CONVERSATION吧?)
UPDATE
我的印象是,如果您將ScopeType指定爲getInstance方法,您將能夠在該範圍內創建對象
如果目標組件沒有關聯的期望範圍,則getInstance方法不會創建該範圍內的組件。相反,它執行通過使用Contexts.lookupInStatefulContexts直到分層搜索得到一些分配的範圍內
如果你想要一個以上的範圍可以被分配到一個組件,必須使用@Role(@Roles)註釋
scecify它@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);
記得縫進行查找的字段/屬性名
private @In User user; // Take ScopeType.EVENT as scope
private @In User loggedUser; // Take ScopeType.SESSION as scope
中選取它。將範圍類型提供給'Component.getInstance'告訴Seam應該在哪個上下文中開始搜索實例。 – kraftan 2010-10-14 18:46:31
這絕對是一種矯枉過正,我的印象是,如果你指定ScopeType爲getInstance方法,你將能夠在該範圍內創建對象並銷燬它(如果它是Type方法的話)。 – Sam 2010-10-15 03:28:45
我添加了@PreConstruct和@PreDestroy來查看調用行爲和一些奇怪的行爲,所有我的SEAM對象在每次調用時都被創建和銷燬。我真誠地不理解這種奇怪的行爲,因爲我想控制對象的創建範圍。 – Sam 2010-10-15 03:30:23
我假設你UserHome
類擴展Seam的EntityHome
類。超一流的EntityHome
,這是Home
,在範圍ScopeType.CONVERSATION
:
@Scope(ScopeType.CONVERSATION)
public abstract class Home<T, E> extends MutableController<T>
要麼你沒有覆蓋範圍在UserHome
聲明或縫忽略子類@Scope
註釋如果超類中的一個已經有一個@Scope
註解。
這些是seam生成的類,我沒有覆蓋Home接口的任何範圍變量,因爲我認爲它對於編輯/更新而言需要正常工作。 – Sam 2010-10-15 03:26:37
你的UserHome組件的範圍是什麼? – 2010-10-14 18:09:12
沒有指定任何東西,因此假設它從基類 – Sam 2010-10-15 03:31:33