在我的项目中,我在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实现,但是使用一个反对的其他是否有任何好处?或者这两个产生相同的旋转变压器没有性能差异?
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)
解析器将具有与发出请求的用户相同的权限.
在性能方面,我不知道任何文档推荐一种方法或另一种方法.