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