@postconstructor在AEM SlingModel概念中的用途是什么?
在@postconstructor在AEM SlingModel概念中的用途是什么?,aem,sling-models,Aem,Sling Models,在SlingModel中使用时,何时可以使用@postconstructor @Model(adaptables=SlingHttpServletRequest.class) public class MyModelTest { @Inject private PrintWriter out; @Inject @Named("log") private Logger logger; @PostConstruct protected v
SlingModel
中使用时,何时可以使用@postconstructor
@Model(adaptables=SlingHttpServletRequest.class)
public class MyModelTest {
@Inject
private PrintWriter out;
@Inject
@Named("log")
private Logger logger;
@PostConstruct
protected void sayHelloTest() {
logger.info("hello world");
}
}
各国:
@PostConstruct注释可用于添加在完成所有注入后调用的方法:
在您提供的“注入”示例代码中,文档谈到的是您用@Inject
注释注释的字段
当Sling模型实例化时,Sling将“注入”这些字段。这意味着您不必自己设置这些字段,但Sling会处理它。这也被称为
回到您的问题:Sling注入所有这些字段后,将调用带有@PostConstruct
注释的方法。通常,开发人员使用此方法进一步初始化吊索模型
整个过程如下所示:
newmymodeltest()
)@Inject
注释)@PostConstruct
注释的方法@PostConstruct
注释基本上是构造函数的替代品。如果要为模型编写构造函数,您会注意到,当调用构造函数时,所有带有@Inject
注释的字段都尚未设置。如果您试图对这些字段进行进一步初始化,您将得到一个NullPointerException
这就是为什么引入了@PostConstruct
注释。它允许您进行通常在构造函数中进行的进一步初始化
附加说明
将依赖项注入字段称为“字段注入”。还有另一种方法可以通过构造函数注入这些依赖项。这称为“构造函数注入”
就我个人而言,如果可能的话,我喜欢将构造函数注入与Sling模型结合使用。使用构造函数注入有助于提高模型的不变性,有助于减少状态并提高可测试性。这是您通常应该在代码中努力实现的
您的代码示例在构造函数注入方面如下所示:
@Model(adaptables=SlingHttpServletRequest.class)
public class MyModelTest {
private final Logger logger;
private final PrintWriter out;
@Inject
public MyModelTest(
@ScriptVariable @Named("log") final Logger logger,
@ScriptVariable @Named("out") final PrintWriter out
) {
this.logger = logger;
this.out = out;
}
}
类字段logger
和out
现在可以设置final
,这增加了不变性,因为它们不能再被更改
当您注入服务等以进行进一步初始化时,您也可以将结果存储在final
类字段中,而不是将服务引用本身作为类字段注入。理论上,这些引用可能指向一个不存在的服务(服务可以在OSGi中来来去去)。例如:如果您有一个存储您需要的配置的服务,您可以只读取您感兴趣的配置值,然后将其存储在类字段中
最后但并非最不重要的一点是可测试性得到了改进,因为您现在可以通过调用
newmymodeltest([…])
并传递logger
和out
(newmymodeltest(mockLogger,mockOut)
)的模拟来创建实例。如果要使用字段注入,则必须使用通常不希望在代码中使用的字段注入。尽管必须指出,Sling项目包含对使用现场注入的测试模型的支持。在这里提问之前,请阅读文档@艾哈迈德穆萨兰,我读了你分享的文件。我对SlingModel不熟悉。我没有弄清楚。你能解释一下吗?@Sara_123根据这一点,我回答了你的问题。通常,您需要仔细阅读文档,并真正尝试解决您的问题。问一个关于StackOverflow的问题来跳过谷歌搜索通常是不受欢迎的。无论如何我希望我的回答能帮助你理解@postcontract
注释的作用。@Sara\u 123如果这个答案对你有帮助,那么请接受它作为正确答案。如果您对我的答案有任何疑问,也可以随时询问。