Sling resource.getResourceResolver()Vs SlingHttpRequest.getResourceResolver

Sar*_*ash 2 sling aem

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

@Inject private Resource resource;
ResourceResolver resolver = resource.getResourceResolver();
Run Code Online (Sandbox Code Playgroud)

VS

@Inject @Self private SlingHttpServletRequest request;
ResourceResolver resolver = request.getResourceResolver();
Run Code Online (Sandbox Code Playgroud)

虽然两者都是Sling实现,但是使用一个反对的其他是否有任何好处?或者这两个产生相同的旋转变压器没有性能差异?

ton*_*edz 9

Resource#getResourceResolver返回ResourceResolver从存储库中检索资源的位置.这种检索通常与请求相关联但不一定是这种情况.

SlingHttpServletRequest#getResourceResolver返回ResourceResolver检索所请求资源的位置.

这些资源解析器可能是相同的,但它取决于您的Sling模型实例化的方式.

例如,想象一下与请求没有直接关联的OSGi服务.它可能是某种事件处理程序,偶尔执行一次并加载一些资源.例如,它可以检索ResourceResolver使用a ResourceResolverFactory和服务用户映射.

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

在这种情况下,您将无法注入SlingHttpSerlvetRequest对象,因此这将失败:

@Inject
@Self
private SlingHttpServletRequest request;
Run Code Online (Sandbox Code Playgroud)

一般来说,语义上存在差异.

如果我们查看在请求范围内检索您正在调整的资源的简单情况,则以下两个ResourceResolver实例应该是等效的:

@Inject private Resource resource;
ResourceResolver resolver = resource.getResourceResolver();
Run Code Online (Sandbox Code Playgroud)

@Inject @Self private SlingHttpServletRequest request;
ResourceResolver resolver = request.getResourceResolver();
Run Code Online (Sandbox Code Playgroud)

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

在性能方面,我不知道任何文档推荐一种方法或另一种方法.