使用 Sling 适配器 using-sling-adapters
Sling提供适配器模式,以便方便地翻译实现Adaptable接口的对象。 此接口提供了一个通用adaptTo()方法,它将对象转换为作为参数传递的类类型。
例如,要将Resource对象转换为对应的Node对象,您只需执行以下操作:
Node node = resource.adaptTo(Node.class);
用例 use-cases
有以下用例:
-
获取特定于实施的对象。
-
快捷方式创建需要传递内部上下文对象的对象。
例如,基于JCR的
ResourceResolver
保留对请求的JCR Session
的引用,而基于该请求会话工作的许多对象(如PageManager
或UserManager
)需要该引用。 -
服务的快捷方式。
极少数情况 —
sling.getService()
也非常简单。
Null返回值 null-return-value
adaptTo()
可以返回null。
返回空值有各种原因,包括:
- 实施不支持目标类型
- 处理此情况的适配器工厂未处于活动状态(例如,由于缺少服务引用)
- 内部条件失败
- 服务不可用
正确处理空值情况很重要。 对于jsp渲染,如果导致jsp失败导致内容为空,则最好是让jsp失败。
缓存 caching
为了提高性能,实施可以缓存从obj.adaptTo()
调用返回的对象。 如果obj
是相同的,则返回的对象是相同的。
对所有基于AdapterFactory
的案例执行此缓存。
但是,没有一般规则 — 对象可以是新实例或现有实例。 因此,这意味着您无法依赖任何一种行为。 因此,对象可在此方案中重用,这一点很重要,尤其是在AdapterFactory
内。
工作原理 how-it-works
有多种方法可以实现Adaptable.adaptTo()
:
-
对象本身;实现方法本身并映射到某些对象。
-
通过
AdapterFactory
,可以映射任意对象。对象仍必须实现
Adaptable
接口,并且必须扩展SlingAdaptable
(它将adaptTo
调用传递到中央适配器管理器)。此方法允许挂接到现有类(如
Resource
)的adaptTo
机制。 -
两者的组合。
对于第一种情况,Java™文档可以说明哪些adaptTo-targets
是可能的。 但是,对于特定的子类(如基于JCR的资源),此语句通常是不可能的。 在后一种情况下,AdapterFactory
的实现通常是捆绑包的私有类的一部分,因此未在客户端API中公开,也未在Java™文档中列出。 从理论上讲,可以从OSGi服务运行时访问所有AdapterFactory
实现并查看其“可适应的”(源和目标)配置,但不能将它们相互映射。 最后,它取决于内部逻辑,必须记录该逻辑。 因此,此参考内容。
引用 reference
Sling sling
资源 已适应:
ResourceResolver 适应:
还没有目标,但实施了Adaptable,并且可以在自定义AdapterFactory中用作源。
WCM wcm
页面 适应:
组件 适应:
模板 适应:
安全性 security
可授权、用户 和 组 适应:
DAM dam
资源 已适应:
标记 tagging
标记 适应:
其他 other
此外,Sling / JCR / OCM还为自定义OCM (对象内容映射)对象提供了AdapterFactory
。