Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
@postconstructor在AEM SlingModel概念中的用途是什么?_Aem_Sling Models - Fatal编程技术网

@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
注释的方法。通常,开发人员使用此方法进一步初始化吊索模型

整个过程如下所示:

  • Sling创建模型的新实例(例如,
    newmymodeltest()
  • Sling注入您声明的所有依赖项(请参见
    @Inject
    注释)
  • Sling将调用带有
    @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如果这个答案对你有帮助,那么请接受它作为正确答案。如果您对我的答案有任何疑问,也可以随时询问。