2017-07-21 23 views
2

在我的項目,我在吊索模型類看,資源解析器取2種方式吊帶resource.getResourceResolver()與SlingHttpRequest.getResourceResolver

@Inject private Resource resource; 
ResourceResolver resolver = resource.getResourceResolver(); 

Vs的

@Inject @Self private SlingHttpServletRequest request; 
ResourceResolver resolver = request.getResourceResolver(); 

雖然兩者都是Sling的實現,是否有使用一個相反的其他好處?還是這兩個產量相同的解析器沒有性能差異?

回答

7

Resource#getResourceResolver返回從資源庫中檢索資源的ResourceResolver。這種檢索通常會與請求相關聯,但不一定是這種情況。

SlingHttpServletRequest#getResourceResolver返回請求資源被檢索到的ResourceResolver

這些資源解析器可能是相同的,但它取決於您的Sling模型實例化的方式。

例如,想象一個與請求沒有直接關聯的OSGi服務。它可能是某種類型的事件處理程序,它會暫時執行並加載一些資源。例如,它可以使用ResourceResolverFactory和服務用戶映射檢索ResourceResolver

ResourceResolver serviceResourceResolver = resourceResolverFactory.getServiceResourceResolver(authenticationInfo); 
Resource someResource = serviceResourceResolver.getResource("/path/to/resource"); 
someResource.adaptTo(MyModel.class); 

在這種情況下,你將不能夠注入SlingHttpSerlvetRequest對象,因此這將失敗:

@Inject 
@Self 
private SlingHttpServletRequest request; 

一般而言,有,因此,在語義不同。

如果我們看一下你在哪裏適應的資源在請求的範圍被檢索的簡單的情況下,以下兩種情況ResourceResolver應該是等價的:

@Inject private Resource resource; 
ResourceResolver resolver = resource.getResourceResolver(); 

@Inject @Self private SlingHttpServletRequest request; 
ResourceResolver resolver = request.getResourceResolver(); 

解析器將具有與發出請求的用戶相同的權限。

說到性能,我不知道任何文檔推薦一種方法或其他。

+0

感謝您的詳細解釋。 –