我们是否需要同时关闭 Resource Resolver 和 Session?

Do we need to close Resource Resolver and Session both?

我正在从 ResourceResolverFactory 获取一个 ResourceResolver 对象,即我正在创建这个 resourceResolver 并且我正在适应 Session。

Session session = resourceResolver.adaptTo(Session.class);

我是否需要同时关闭解析器和会话,或者关闭一个就足够了?

finally {
    if (session != null && session.isLive()) {
        session.logout();
    }

    if (resourceResolver != null && resourceResolver.isLive()) {
        resourceResolver.close();
    }
}

这个问题是关于"should we be closing both"而不是先关闭哪个

关闭一个将同时关闭它们。如果您记录消息或调试,您会看到您没有输入第二个 if 语句。

当您调用 ResourceResolver.close() 方法时,ResourceResolver 将关闭基础 Session

如果您使用较新版本的 Sling,我建议您在使用 ResourceResolver:

时使用 try-with-resource 结构
try (final ResourceResolver resolver = this.getResourceResolver()) {
    [... use resolver here ...]
}

由于 ResourceResolver 实现了 AutoClosable 接口,它可以与 try-with-resource 一起使用。这将始终关闭 ResourceResolver,您将不必处理异常等

请注意,您只能使用您创建的 ResourceResolver 来执行此操作。例如,如果您使用从 Resource 获得的 ResourceResolver,则不应关闭它。最好的做法是只有 ResourceResolver 的创建者才能关闭它。