谁能给我解释一下通过注释@ScriptVariable
和注释@SlingObject
调用resourceResolver
的区别?在什么情况下他们的行为不同?
关键的区别在于对象的检索方式。@ScriptVariable
和@SlingObject
是特定于注入器的注释。这意味着你可以使用它们来指示Sling model使用特定的注入器。
能够识别@ScriptVariable
注释的注入器可以注入作为脚本变量可用的对象。在resourceResolver
的情况下,它应该是与请求相关联的。同slingRequest.getResourceResolver()
。
查看代码,在带有@SlingObject
注释的字段上启动的注入器更有趣,因为它将检查可适应的(您的Sling模型正在被适应)并相应地获得解析器:
- 如果adaptive是
Resource
,它将返回resource.getResourceResolver()
,即最初用于加载资源的解析器。这可能很随意。 - 如果adaptive是
SlingHttpServletRequest
,它将返回request.getResourceResolver()
,即Sling实例化的与请求和用户发出请求的会话相关的解析器。 - 如果adaptive本身是
ResourceResolver
,则直接返回。
在某些情况下,这三者之间的差异可以忽略不计,但有时选择哪个解析器非常重要。例如,如果你的模型应该在请求范围之外使用(想象它是由一个按时间表运行的OSGi服务实例化的,并且没有传入的请求),你最好使用resource
或resourceResolver
作为可适应的。