model - 吊带型号说明
问题描述
我玩了很多模型……做了一些非常奇怪的事情,这很有趣……但现在我遇到了一些我无法理解的东西。有源的概念,也有通孔的概念。@Source
是一个注释,如果我想强制一个,它可以帮助我从可用的已注册注入器中选择一个注入器,并@Via
帮助我在给定注入器的上下文中更改默认注入行为。围绕这些,我有以下问题。
@Source
和有什么区别@Via
?
我的理解是@Source
告诉谁注入了价值,并且它总是在您的@model
注释中的可适应的上下文中。某些来源将不起作用,它的可适应性是资源,而某些来源将不起作用是可适应性的SlingHttpServletRequest
。并在 a 的上下文中@Source @via
告诉行为应该如何。这是一个奇怪的例子,但一个有效的例子
@Inject
@Source("child-resources")
@Named("topnav")
@Via(value = "jcr:content", type = ChildResource.class)
String text;
意味着使用注入器“子资源”注入,节点的名称是“topnav”,在该上下文中,转到被调用的子节点jcr:content
并获取名为的属性名称text
。我知道我可以用一行很容易地做到这一点,但这只是为了讨论。
到目前为止我的理解正确吗?如果是的话,你可以给我更多的例子吗?
是否使用注入器特定的注解(如 @ScriptVariable)只是为了减少代码行数,因为它们看起来只不过是两个或三个基本注解打包在一起。
我什么时候写一个自定义注入器?编写自定义注入器以从 servlet 获取请求参数是一个好场景吗?
现在最有趣的问题。我遇到了一些顶部有类似这样的东西的模型
@Model
(adaptables={Resource.class, SlingHttpServletRequest.class}
。我试过这样做从来没有被视为资源。SlingHttpServletRequest
优先,因为从来@Self
没有给我资源。@Inject
从不给我 valuemap 值。我不得不添加@Via("resource")
哪个证明SlingHttpServletRequest
优先。所以它让我想到为什么要这样做?真正的用途是什么,或者这只是一段错误的代码?
解决方案
我会按照你提出的顺序回答你的问题。
1)@Source 告诉模型使用特定类型的 Injector 进行注入,@Via 告诉选定的 Injector 使用不同的资源来获取将被注入的值,然后是基本的 Adaptable。@Name 用于标识属性,如果使用@Name,则属性名称将被忽略。所以你的例子发生了什么
`resource.getChild("jcr:content").getValueMap().get("topNav", String.class)
2) 是的,它们是原始版本的 Sling 模型的遗留物
3)这在很大程度上取决于您尝试创建的模型的复杂性。参数绝对是需要自定义注入器的东西,尽管过去曾讨论过将其添加到当前的模型注入器中。它可能比您通常能够执行的操作更复杂,例如访问有关 ServletRequest 的元数据,例如 IP 注入器。
4) 要获取模型,您需要一个支持 Adaptable 接口的对象,然后您执行 AdaptablesapaptableObject.adaptTo(MyModel.class)
注释告诉模型可以使用哪种类型的对象来适应该模型。最常用的是 Resource 和 SlingHttpServletRequest。因此,如果它总是被视为 ServletRequest,那是因为您使用 servletRequest 作为您正在适应模型的对象。但其中一个痛点是几乎所有注入器都处理请求,但并非所有注入器都处理资源。因此,声明一个模型同时接受这两种方法,意味着您可以使用的喷油器受到限制。
包名称中包含“sling”的任何内容都是开源项目的一部分,并且在他们的网站上有大量信息。
推荐阅读
- javascript - 新标签不会打开 window.open html 和 js
- r - 如何从包含两个感兴趣的关键字的行中检索一个值以在 R 上创建一个新列?
- python - 使用值后跟键进行排序?
- python - 添加更多模型时,Django 模型停止工作
- forms - VBA设置所有形式的所有控件
- ruby - 从 ruby 对象获取原始指针(源自 C 库)
- javascript - 如何将变量传递给 puppeteer 中的页面?
- python - 如何根据 Python 中的某些标头拆分文本文件并下载音频文件
- javascript - 如何根据标签在 JavaScript 中的顺序更改标签的内部 HTML?
- angular - Angular 9.0.5 无法绑定 ngIf 和 ngFor