Aem sightly var和sling模型调用';盖特是谁?

Aem sightly var和sling模型调用';盖特是谁?,aem,sightly,htl,Aem,Sightly,Htl,以下两者之间的区别是什么: <div data-sly-test.backgroundVideo="${hero.backgroundVideo}" > Background video URL: <a href="${backgroundVideo}.html" target="_blank"> ${backgroundVideo} </a> </div> 背景视频URL: 以

以下两者之间的区别是什么:

<div data-sly-test.backgroundVideo="${hero.backgroundVideo}" >
    Background video URL:
        <a href="${backgroundVideo}.html" target="_blank">
            ${backgroundVideo}
        </a>
</div>

背景视频URL:
以及:


背景视频URL:

什么解决方案更有效?使用sightly变量或调用getter?

正如您所注意到的,不同之处在于,
${hero.backgroundVideo}
的求值缓存在一个变量中。这对性能有一定的影响,因为它不需要进行一些反射来找到调用
英雄的正确方法;如果调用的方法很昂贵(JCR查找、远程调用…),则影响会大得多。正如您所注意到的,不同之处在于,
${hero.backgroundVideo}
的计算缓存在一个变量中。这对性能有一定的影响,因为它不需要进行一些反射来找到调用
英雄的正确方法;如果被调用的方法很昂贵(JCR查找、远程调用…),那么影响可能会大得多。很明显,就像类似领域的任何其他编程语言一样,不会对变量的使用提出任何要求。一个简单的比较是将代码转换成等效的Java例程,并查看优化和性能效果(理论上)

为了简单起见,让我们按如下方式创建POJO类:

class Hero {

    public string getBackgroundVideo() {
        //Some model logic
    }

}

现在,考虑第一个代码片段:

<div data-sly-test.backgroundVideo="${hero.backgroundVideo}" >
     Background video URL:
        <a href="${backgroundVideo}.html" target="_blank">
        ${backgroundVideo}
        </a>
</div>
<div data-sly-test="${hero.backgroundVideo}" >
    Background video URL:
    <a href="${hero.backgroundVideo}.html" target="_blank">
        ${hero.backgroundVideo}
    </a>
</div>
getBackgroundVideo()
将执行3次

因此,从表面上看,这在执行上可能看起来是1:3的差异,特别是当
getBackgroundVideo()
函数中涉及复杂的代码逻辑时,这看起来成本非常高。这是事实,您应该通过尝试将复杂函数的输出缓存为变量来避免这种方法

然而,从另一个角度来看这个问题,这也可以归结为您的POJO类编写得有多好。因此,让我们重新回顾一下您的
英雄
课程:

class Hero {
    private string backgroundVideo;

    public void init() {
         this.backgroundVide = "some value on business logic";
    }

    public string getBackgroundVideo() {
        return this.backgroundVideo;
    }

}
如果您的
Hero
POJO类是如上所述实现的,那么
getBackgroundVideo()
就是一个简单的getter,它返回一个字符串值,而不需要复杂的计算。当然,与局部HTL变量相比,函数调用的开销是很小的,而且可能不明显


总而言之,真正的效果只能通过POJO实现来衡量,但HTL变量方法几乎总能给您带来缓存的好处。

很明显,就像类似领域的任何其他编程语言一样,不会强制要求变量的使用。一个简单的比较是将代码转换成等效的Java例程,并查看优化和性能效果(理论上)

为了简单起见,让我们按如下方式创建POJO类:

class Hero {

    public string getBackgroundVideo() {
        //Some model logic
    }

}

现在,考虑第一个代码片段:

<div data-sly-test.backgroundVideo="${hero.backgroundVideo}" >
     Background video URL:
        <a href="${backgroundVideo}.html" target="_blank">
        ${backgroundVideo}
        </a>
</div>
<div data-sly-test="${hero.backgroundVideo}" >
    Background video URL:
    <a href="${hero.backgroundVideo}.html" target="_blank">
        ${hero.backgroundVideo}
    </a>
</div>
getBackgroundVideo()
将执行3次

因此,从表面上看,这在执行上可能看起来是1:3的差异,特别是当
getBackgroundVideo()
函数中涉及复杂的代码逻辑时,这看起来成本非常高。这是事实,您应该通过尝试将复杂函数的输出缓存为变量来避免这种方法

然而,从另一个角度来看这个问题,这也可以归结为您的POJO类编写得有多好。因此,让我们重新回顾一下您的
英雄
课程:

class Hero {
    private string backgroundVideo;

    public void init() {
         this.backgroundVide = "some value on business logic";
    }

    public string getBackgroundVideo() {
        return this.backgroundVideo;
    }

}
如果您的
Hero
POJO类是如上所述实现的,那么
getBackgroundVideo()
就是一个简单的getter,它返回一个字符串值,而不需要复杂的计算。当然,与局部HTL变量相比,函数调用的开销是很小的,而且可能不明显


总而言之,真正的效果只能通过POJO实现来衡量,但HTL变量方法几乎总能给您带来缓存好处。

一个小小的补充:不仅仅是多次执行getter,还有更大的成本。在HTL中,被调用的方法是使用反射来解析的,并且(由于实现的原因),这无法进行太多优化,因此需要在每次调用之前查找这些方法。一个小小的补充:这不仅仅是多次执行getter,还有更大的成本。在HTL中,调用的方法使用反射进行解析,并且(由于实现原因)这不能进行太多优化,因此需要在每次调用之前查找这些方法。