何时显式关闭 Sling 中的 ResourceResolver

When to explicitly close ResourceResolver in Sling

我在 this 博客上阅读了有关如何正确使用 resourceResolver 的内容。作者引用

If you open a JCR session of a Sling ResourceResolver, you are also responsible for closing it. On the other hand: If you get passed a ResourceResolver or a Session object, do not call logout() or close() on it.

我无法理解这个概念,可能是因为在这种情况下没有代码示例。

据我所知,我可以通过 servlet 中的 request.getResourceResolver() 获取 ResourceResolver 对象,在 OSGi 组件中使用 @Reference SCR 注释,jsp 的隐式 resourceResolver 对象,使用 sling.getService() 在 jsp 中,也通过适应 ResourceResolver 对象。

在所有获取resourceResolver对象的方法中,我应该自己关闭哪些以及与这些对象中的每一个相关联的会话是什么?

将其视为文件资源。

  • 如果您打开它,您有责任关闭它
  • 如果您使用对文件的引用,则关闭它不是您的责任

因此,您的代码应该在同一范围内打开和关闭。

如果您从资源中获得 resourceResolver,则您没有打开解析器,也不需要关闭它。

在博客的示例中,他们从 session = repo.loginAdministrative() 生成一个会话(Repository 不再有此方法);因此负责在同一范围内调用 session.logout()(使用 finally {...} 块)。