resourceResolver.adaptTo是否创建新对象或返回缓存对象

时间:2017-02-02 23:38:52

标签: aem sling

我最近遇到过一段代码:

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

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

由于

2 个答案:

答案 0 :(得分:1)

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

  

它显式保留为实现细节,是否每次调用具有相同类型的此方法都会在每次调用时生成相同的对象或新对象。

AdaptTo

类似问题purpose-of-resourceresolver-adapttosession

只需简单解释

  1. ResourceResolver是我们可以解析的服务API Resource(资源是Sling行为的内容)对象。
  2. 资源解析器可通过SlingHttpServletRequest.getResourceResolver()方法用于请求处理servlet。还可以通过ResourceResolverFactory创建资源解析程序。
  3. ResourceResolver通常不是线程安全的!使用解析程序的应用程序必须提供正确的同步,以确保不会有多个线程同时对单个解析程序,资源或结果对象进行操作。
  4. ResourceResolver也是一个Adaptable,可以将适配器转换为其他类型。
  5. 因此,当您通过ResourceResolver获取资源并且适应其他类型或对象的某些表示时,该对象将是相同的。请记住,您在资源上执行的操作(在adaptTO()之后)应该小心,因为资源通常不是线程安全的。更新解析程序的示例,以使用refresh()方法等来反映最新状态

答案 1 :(得分:0)

确定。

我在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;因此证明他们指的是同一个对象。