spring容器什么时候销毁
-
Spring容器销毁的时机取决于容器的类型以及它的生命周期。
对于基于XML配置的Spring容器,它的销毁时机有两种方式:显式销毁和隐式销毁。
- 显式销毁:通过调用容器的close()或者destroy()方法来显式销毁容器。在这种情况下,Spring容器会先销毁所有的Bean,然后释放资源并关闭容器。
例如:
ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); // do something... context.close(); // or context.destroy();- 隐式销毁:当容器对象的生命周期结束时,Spring容器会自动销毁。这通常发生在基于Web应用程序的Spring容器中,当Web应用程序关闭时,容器会随之销毁。这时,容器会按照相反的顺序销毁所有的Bean。
例如,在web.xml中配置的Spring监听器
ContextLoaderListener,它会在Web应用程序启动时创建Spring容器,并在Web应用程序关闭时销毁容器。<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>对于基于注解的Spring容器(如Spring Boot),它的销毁时机由容器管理。当应用程序退出时,Spring Boot容器会自动销毁。
总结起来,Spring容器的销毁时机可以通过显式调用容器的close()或destroy()方法来实现,也可以隐式地在应用程序退出时自动销毁。具体选择哪种方式取决于你的应用场景和需求。
1年前 -
当Spring容器被销毁的时机是在应用程序结束时,或者通过显式调用ApplicationContext的close()或者shutdown()方法来手动销毁容器。
具体来说,Spring容器的销毁包括以下几个情况:
-
应用程序结束:当应用程序的主线程结束时,Spring容器也会随之销毁。这种情况通常发生在web应用的外部容器(如Tomcat)关闭或者应用程序被杀死的时候。
-
显式调用close()方法:ApplicationContext接口定义了一个close()方法,用于显式地关闭和销毁容器。通过调用该方法,可以关闭容器并销毁容器中的所有Bean。
-
显式调用shutdown()方法:ConfigurableApplicationContext接口继承了ApplicationContext接口,并新增了一个shutdown()方法。该方法用于优雅地关闭容器,首先会调用所有已注册的钩子(hook),然后销毁容器中的所有Bean。
-
JVM关闭钩子:当JVM即将关闭时,Spring容器会通过添加一个关闭钩子来销毁容器。关闭钩子在JVM关闭之前被触发,用于执行一些清理操作。例如,关闭数据库连接、释放资源等。
-
销毁单例Bean:Spring容器在销毁时会首先销毁所有的单例Bean,即在容器启动过程中通过默认的单例作用域创建的Bean。容器会调用Bean的destroy()方法,在该方法中可以执行清理资源的操作。
总之,Spring容器的销毁时机主要包括应用程序结束、显式调用close()或者shutdown()方法、JVM关闭钩子和销毁单例Bean。通过合适的方式来销毁容器,可以确保资源的释放和清理操作的执行,提高应用程序的稳定性和可靠性。
1年前 -
-
Spring容器的销毁时机取决于应用程序的生命周期。具体来说,Spring容器在以下情况下会被销毁:
-
Web 应用程序关闭时:当应用程序关闭时,Servlet容器会通知Spring容器进行销毁。这时,Spring容器会触发相关的销毁回调方法,执行必要的清理工作。
-
ApplicationContext的close()方法调用时:如果使用编程的方式创建Spring容器,即使用ApplicationContext接口的实现类(例如ClassPathXmlApplicationContext、AnnotationConfigApplicationContext等)来创建容器对象,那么可以通过调用close()方法来手动销毁容器。close()方法会触发相关的销毁回调方法,执行必要的清理工作。
-
ApplicationContext的registerShutdownHook()方法使用时:通过在Spring容器创建后调用registerShutdownHook()方法注册一个JVM关闭钩子,可以在JVM关闭时自动触发Spring容器的销毁。这种方式通常适用于独立的Java应用程序,而不是Web应用程序。
无论是哪种方式,Spring容器的销毁都包括以下步骤:
-
调用所有实现了DisposableBean接口的Bean的destroy()方法。DisposableBean接口定义了一个destroy()方法,用于在Bean被销毁时进行清理工作。需要注意的是,当Bean同时实现了InitializingBean接口时,destroy()方法将在afterPropertiesSet()方法之前执行。
-
调用所有通过
标签的destroy-method属性指定的自定义销毁方法。通过在 标签中添加destroy-method属性并指定方法名,可以在Bean被销毁时执行指定的方法。例如: -
发布容器关闭事件:在容器销毁过程中,Spring会发布一个ContextClosedEvent事件。可以通过实现ApplicationListener接口并监听ContextClosedEvent事件,来在容器关闭时执行进一步的清理工作。
总之,Spring容器的销毁主要是为了释放资源、关闭连接、执行清理工作等。在编写应用程序时,可以根据具体的需求和场景选择合适的销毁方式。
1年前 -