resourceResolver.adaptTo 是创建新对象还是 return 缓存对象

Does resourceResolver.adaptTo create new object or return a cached object

我最近遇到一段代码是这样的:

for(int i=0;i<10000;i++) { 
   ....
   PageManager manager = resourceResolver.adaptTo(PageManager.class);
   ....
}

这是否意味着将创建 10000 个 PageManager 对象,或者我们每次都获得相同的对象?

谢谢

查看 Adaptable 文档希望它能回答您的问题

it is explicitly left as an implementation detail whether each call to this method with the same type yields the same object or a new object on each call.

类似问题purpose-of-resourceresolver-adapttosession

简单说明一下

  1. ResourceResolver is the service API which we can resolve Resource(资源是 Sling 作用的内容片段)对象。
  2. 资源解析器可通过 SlingHttpServletRequest.getResourceResolver() 方法用于请求处理 servlet。也可以通过 ResourceResolverFactory.
  3. 创建资源解析器
  4. ResourceResolver 通常不是线程安全的! 使用解析器的应用程序必须提供适当的同步以确保不超过一个线程同时对单个解析器、资源或结果对象。
  5. ResourceResolver 也是一个 Adaptable,可以获取其他类型的适配器。

所以当你通过 ResourceResolver 获取资源并适配到其他类型或对象的某些表示时,对象将是相同的。请记住,您在资源上执行的操作(在 adaptTO() 之后)应该小心,因为资源通常不是线程安全的。例如,通过使用 refresh() 方法等更新解析器以反映最新状态

好的。

我在API中找不到具体实现,但我写了这个示例代码来测试:

    ResourceResolver res = request.getResourceResolver();
    PageManager temp = res.adaptTo(PageManager.class);
    for (int i=0; i < 100; i++) {
        PageManager mgr = res.adaptTo(PageManager.class);

        out.println("For iteration: " + i + " The object is: " + mgr.hashCode());
        if (temp == mgr) {
            out.println("For iteration: " + i + " the objects are equal");
        }
        temp = mgr;
    }

我每次都得到相同的哈希码,并且两个引用在与 == 比较时返回 true;因此证明它们指向同一个对象。