2010-10-14 96 views
2

即使我已將範圍類型指定爲方法,它也會在CONVERSATION範圍內實例化。組件實例如何與範圍類型配合工作

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

這很混亂,有人可以解釋這種行爲嗎?

+0

你的UserHome組件的範圍是什麼? – 2010-10-14 18:09:12

+0

沒有指定任何東西,因此假設它從基類 – Sam 2010-10-15 03:31:33

回答

2

當你調用

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 
+0

中選取它。將範圍類型提供給'Component.getInstance'告訴Seam應該在哪個上下文中開始搜索實例。 – kraftan 2010-10-14 18:46:31

+0

這絕對是一種矯枉過正,我的印象是,如果你指定ScopeType爲getInstance方法,你將能夠在該範圍內創建對象並銷燬它(如果它是Type方法的話)。 – Sam 2010-10-15 03:28:45

+0

我添加了@PreConstruct和@PreDestroy來查看調用行爲和一些奇怪的行爲,所有我的SEAM對象在每次調用時都被創建和銷燬。我真誠地不理解這種奇怪的行爲,因爲我想控制對象的創建範圍。 – Sam 2010-10-15 03:30:23

1

我假設你UserHome類擴展Seam的EntityHome類。超一流的EntityHome,這是Home,在範圍ScopeType.CONVERSATION

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

要麼你沒有覆蓋範圍在UserHome聲明或縫忽略子類@Scope註釋如果超類中的一個已經有一個@Scope註解。

+0

這些是seam生成的類,我沒有覆蓋Home接口的任何範圍變量,因爲我認爲它對於編輯/更新而言需要正常工作。 – Sam 2010-10-15 03:26:37