Spring bean破坏方法

时间:2016-04-23 01:02:25

标签: java spring servlets

在现实世界的应用程序中使用destroy方法的可能示例是什么?为什么正在运行的应用程序想要销毁它的bean?如果bean是由用于Web应用程序的spring容器创建的,例如ContextLoaderListener,那么如何重新创建这些bean,因为容器已经启动。有没有办法重新启动弹簧IoC容器而无需重新启动应用程序服务器?

3 个答案:

答案 0 :(得分:4)

一个例子是DataSource或需要清理的任何资源。你可能会有这样的事情:

@Bean(destroyMethod = "close")
DataSource dataSource() {
 ....
}

在具有多个类加载器(如应用程序服务器)以防止内存泄漏的环境中,这一点尤为重要。

有时候这样做是多余的,因为底层资源可以自己进行清理(比如作为servlet生命周期中contextDestroyed事件的一部分),但是你应该总是验证这一点。

这些春天docs也是一个有用的参考。引用的例子类似:

<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>

然后是bean类:

public class ExampleBean {

    public void cleanup() {
        // do some destruction work (like releasing pooled connections)
    }
}

可以刷新上下文。这个answer提供了一个很好的解释,当你想要这样做时。

答案 1 :(得分:1)

贝洛是我的观点:

  

在现实世界的应用程序中使用destroy方法的可能示例是什么?

对于大多数应用程序,我们可能主要关注实际业务,因此我们不会经常遇到需要定义销毁方法的场景。但是当您遇到一些基本组件或中间件时,您需要注意资源管理,例如数据库连接内存使用磁盘使用等。您必须知道如何清楚地释放不必要的资源,否则会导致严重问题。

  

如果bean是由用于Web应用程序的spring容器创建的,例如ContextLoaderListener,那么如何重新创建这些bean,因为容器已经启动了?

Spring容器不仅适用于 Web应用程序,它还可以用于常见的Java应用程序(主要应用程序)。 Spring容器有两种不同的 Bean类型 Singleton Prototype ), Singleton Bean 仅在 Spring容器完成启动时预先实例化,而原型Bean 将通过每次调用 getBean 进行实例化。

  

有没有办法在不重启应用程序服务器的情况下重启spring IoC容器?

Spring IoC Container 开始通过调用 AbstractRefreshableApplicationContext.refresh()方法进行实例化。如果您之前已实例化容器,此方法将销毁整个 Spring IoC容器。因此,您可以调用此方法来重新实例化容器。如果你想了解 Spring IoC机制,我建议你阅读Spring的源代码: spring-core spring-beans 弹簧上下文

希望能帮到你。

答案 2 :(得分:0)

我在Spring应用程序中看到了直接或间接启动非守护程序线程的bean。然后就不可能在不杀死进程的情况下停止进程。这影响了一些处理自动化测试的Jenkins工作。所以有很多真实世界的例子,特别是在DevOps世界中