gpt4 book ai didi

java - CDI @ApplicationScoped

转载 作者:行者123 更新时间:2023-12-01 12:23:17 26 4
gpt4 key购买 nike

我有一个带注释的 on 对象

@ApplicationScoped
public class DbGraphConnectionLocator implements ServerStopTask {
...
}

该对象创建一个嵌入式数据库。

我尝试创建一个钩子(Hook)来在重新部署应用程序时关闭数据库。

所以我构建了这个类

@WebListener
public class UndeployHook implements ServletContextListener{
@Inject
DbGraphConnectionLocator dbGraphConnectionLocator;


@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {

}

@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
try {
dbGraphConnectionLocator.executeStopTask();
} catch (Exception e) {
e.printStackTrace();
}
}
}

实际上调用了 contextDestoyed 方法,但其中使用的对象不是启动时创建的原始 DbGraphConnectionLocator,这给我带来了一些麻烦。

我认为带有注释

@ApplicationScoped
public class DbGraphConnectionLocator implements ServerStopTask { ....}

DbGraphConnectionLocator 的实例在应用程序级别必须是唯一的,因此当我将它与

@Inject
DbGraphConnectionLocator dbGraphConnectionLocator;

我必须找到我的应用程序启动时创建的相同实例,但事实并非如此,创建了另一个实例。

无论如何,我决定添加

@PreDestroy
public void shutdownDB(){
graphDb.shutdown();
}

到 DbGraphConnectionLocator。有关信息,我看到这个方法是在 contextDestroyed 方法之后调用的,这意味着当调用 contextDestroyed 时原始实例仍然存在,所以我错过了一些东西......

有什么提示吗?

最佳答案

如果嵌入式数据库应在应用程序启动时创建并在应用程序停止时关闭,只需执行以下操作:

@ApplicationScoped
@Startup
public class AnyNameForYourApplicationClass {

@PostConstruct
public void connectDB() {
// creates the db connection at startup
}

@PreDestoy
public void disconnectDB() {
// disconnects from the db
}
}

这应该可以做到。或者,您也可以使用 CDI 生成器来创建应用程序范围的数据库连接。然后您可以使用处理程序方法断开与数据库的连接。

在您的情况下,行为是正确的,因为当调用 Web 监听器时,应用程序必须仍然处于 Activity 状态。因此,当应用程序范围的 bean 被销毁时,会调用带有 @PreDestroy 的 shutdownDB 方法。由于您在监听器中引用它,因此它必须保持 Activity 状态,直到监听器被销毁。

关于java - CDI @ApplicationScoped,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26510194/

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