Java 当spring上下文加载失败时停止服务器的已知方法?

Java 当spring上下文加载失败时停止服务器的已知方法?,java,spring,tomcat,Java,Spring,Tomcat,有时在开发过程中,某些内容会被破坏,从而导致spring上下文无法加载。 问题是,有时错误只出现在一些bean中,但webapp的其余部分正在部分加载,然后会出现一些奇怪的行为 有没有一种已知的方法可以让Spring停止服务器进程,以防发生不好的事情?比如一些注射失败的豆子,或者一些NPE发生在一些施工后的事情 类似于web.xml中的stopOnError=true。因此,我最终找到的解决方案是: 创建一个实现ServletContextListener的类,称之为ApplicationLoa

有时在开发过程中,某些内容会被破坏,从而导致spring上下文无法加载。 问题是,有时错误只出现在一些bean中,但webapp的其余部分正在部分加载,然后会出现一些奇怪的行为

有没有一种已知的方法可以让Spring停止服务器进程,以防发生不好的事情?比如一些注射失败的豆子,或者一些NPE发生在一些施工后的事情


类似于web.xml中的stopOnError=true。

因此,我最终找到的解决方案是: 创建一个实现ServletContextListener的类,称之为ApplicationLoaderListener

在web.xml中设置此类:

<listener>
    <listener-class>com.my.package.ApplicationLoaderListener</listener-class>
</listener>
此类必须实现两个接口方法,相关接口方法是上下文化的:

@Override
public void contextInitialized(ServletContextEvent sce) {
    try {
        loader.contextInitialized(sce);
    } catch (BeanCreationException e) {
        handle(e);
    }
}
以及handle()的实现:

为了使代码完整,第二种方法是:

@Override
public void contextDestroyed(ServletContextEvent sce) {
    loader.contextDestroyed(sce);
}

实际上,这是spring的默认行为。你是如何加载上下文的?你是什么意思?我知道这是默认行为。我想知道是否有什么东西可以改变它。使用web.xml和tomcat加载上下文。我的意思是默认行为是您实际想要的。我从未见过半成品的春天。如果1000个bean中有1个失败,整个上下文都会失败,则web应用程序不会部署,因此不可用。但服务器仍在加载,如果您有其他web应用程序,它们将加载并尝试通过(消息等)与每个应用程序通信,并且将失败。也许这是一个独特的案例。。。我想要一个将使整个服务器失败的致命错误。等等,如果您的问题是其他应用程序的问题,请确认。如果您的问题是“部分加载”的应用程序,那么您的环境可能会出现问题。ContextLoaderListener的装饰程序:-/我希望有更好的方法,当异常发生时,调用contextDestroyed()但不退出()。因此,也许我们应该在contextDestroyed()中调用exit,而不是handle()。请参阅这里的另一个解决方案:一个解决方案比另一个解决方案有好处吗?
private void handle(BeanCreationException e) {
    log.error("=============== FATAL =============== - failed to create bean: ", e);
    System.exit(1);
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
    loader.contextDestroyed(sce);
}