gpt4 book ai didi

java - 如何在 Plain Java 中使用 PostConstruct

转载 作者:行者123 更新时间:2023-11-29 08:36:18 25 4
gpt4 key购买 nike

我正在开发纯 Java 代码(没有 bean 或容器框架),我想实现 @PostConstruct/@PreDestroy 功能。那可能吗 ?

我写了一个示例代码来检查可行性(下面的代码示例)。但是 postContruct() 和 beforeDestroy() 方法没有被调用。

如何实现?

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class Test {

public static void main (String...strings) {
Test test = new Test();
System.out.println("Ready....");
test.sayHello();
System.out.println("Done...");

}

private void sayHello () {
System.out.println("Hello World !! ");
}

@PostConstruct
public void postConstruct() {
System.out.println("PostConstruct is called .. ");
}

@PreDestroy
public void beforeDestroy () {
System.out.println("beforeDestroy is called ");
}

}

输出是

Ready....
Hello World !!
Done...

最佳答案

您的问题中提到的评论已经说明了这一点:如果您不使用处理注释的框架或工具,那么不,那些 @PostConstruct 是不可能的。和 @PreDestroy -方法被调用。作为旁注:您也可以编写自己的 AnnotationProcessor,但您最终可能会编写一个框架,您可以在其中使用您选择的 CDI 容器之类的东西(例如 Weld、OpenWebBeans 等)。

现在,如果没有注释,你怎么能解决它呢?这取决于你想要达到什么。

例如,如果这并不重要,那么 @PostConstruct在对象构造之后没有被调用,那么实例初始化 block 可能会满足您的需求,例如

class Some {

{
// your initialization code... however! this is not the same as @PostConstruct
}
}

关于 @PreDestroy你可以覆盖 Object.finalize .

自己提供时要小心 finalize - 实现并阅读一些相关文章,然后再执行。

然而,这两种解决方案都不是注释的 1:1 替代品,但它们可能正是您正在寻找的。

这是一个示例类:

class PreDestroyPostConstruct {

PreDestroyPostConstruct() {
System.out.println("constructor");
}

{
System.out.println("initialization block");
}

@Override
protected void finalize() throws Throwable {
System.out.println("finalize");
}
}

演示输出:

PreDestroyPostConstruct obj = new PreDestroyPostConstruct();
obj = null;
System.out.println("Program finishing");

可能的输出:

initialization block
constructor
finalize
Program finishing

请注意,不能保证 finalize"Program finishing" 之前调用-部分,甚至可能发生在 VM 关闭之前它没有被调用/完成。

关于java - 如何在 Plain Java 中使用 PostConstruct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43889376/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com