吊带 resource.getResourceResolver() 对比 SlingHttpRequest.getResourceResolver

Sling resource.getResourceResolver() Vs SlingHttpRequest.getResourceResolver

在我的项目中,我在 Sling 模型中看到 类,资源解析器以两种方式获取

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

VS

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

虽然两者都是 Sling 实现,但使用一个对立的有什么好处吗?还是这 2 个产生相同的解析器而没有性能差异?

Resource#getResourceResolver returns ResourceResolver 用于从存储库检索资源的。这种检索通常会与请求相关联,但并非必须如此。

SlingHttpServletRequest#getResourceResolver returns 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();

解析器将具有与发出请求的用户相同的权限。

就性能而言,我不知道有任何文档推荐其中一种方法。