我想创建配置/bean 以在我的开发配置文件中自动启动 H2DB。我想让它作为 TCP 服务器运行。它需要在任何数据源配置之前启动。有人可以告诉我如何实现这一目标吗?
我做了什么
@Profile("h2")
@Component
public class H2DbServerConfiguration implements SmartLifecycle {
private static final Logger logger = LoggerFactory.getLogger(H2DbServerConfiguration.class);
private Server server;
@Override
public boolean isAutoStartup() {
return true;
}
@Override
public void stop(Runnable callback) {
stop();
new Thread(callback).start();
}
@Override
public void start() {
logger.debug("############################################");
logger.debug("############################################");
logger.debug("STARTING SERVER");
logger.debug("############################################");
logger.debug("############################################");
try {
server = Server.createTcpServer("-web", "-webAllowOthers", "-webPort", "8082").start();
} catch (SQLException e) {
throw new RuntimeException("Unable to start H2 server", e);
}
}
@Override
public void stop() {
logger.debug("############################################");
logger.debug("############################################");
logger.debug("STOPPING SERVER");
logger.debug("############################################");
logger.debug("############################################");
if (server != null)
if (server.isRunning(true))
server.stop();
}
@Override
public boolean isRunning() {
return server != null ? server.isRunning(true) : false;
}
@Override
public int getPhase() {
return 0;
}
}
但这对我来说不是一个选择,因为组件是在数据源之后创建的(我有 liquibase 设置,所以为时已晚)并且 Phase 仍然相同,这意味着 FIFO 顺序,我想成为 FILO。
最佳答案
混合@Profile和@Component对我来说是个坏主意。配置文件旨在与配置 ( documentation ) 一起使用
您真的需要个人资料吗?在我看来,如果您有几种可能的配置(一种基于 H2),并且如果您希望能够在这些配置之间进行切换(通常在启动时通过设置属性...),那么这是有意义的。
使用 bean ( documentation ) 管理 H2 服务器对我来说是正确的(如 Stefen 的建议)。也许您会更喜欢注释...如果您想要一个 spring 配置文件,那么您也需要一个 Configuration 对象。它将简单地加载 H2 服务器 bean(在我看来,使用 bean 管理 H2 服务器生命周期比使用上下文/配置更好)。
关于java - spring bean启动/关闭顺序配置(启动h2 db作为服务器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37066925/