【问题标题】:Spring bean destroy methodSpring bean 销毁方法
【发布时间】:2016-04-23 01:02:24
【问题描述】:

在现实世界的应用程序中使用destroy 方法的一个可能示例是什么?为什么一个正在运行的应用程序要销毁它的 bean?如果 bean 是由 web 应用程序的 spring 容器通过 ContextLoaderListener 创建的,那么如何重新创建这些 bean,因为容器已经启动。有没有办法在不重启Application server的情况下重启spring IoC容器?

【问题讨论】:

    标签: java spring servlets


    【解决方案1】:

    一个例子是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 很好地解释了这一点以及您何时可能想要这样做。

    【讨论】:

      【解决方案2】:

      以下是我的看法:

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

      对于大多数应用来说,可能我们主要关注的是真实的业务,所以我们不会经常遇到需要定义销毁方法的场景。但是当你遇到一些基础组件或者中间件时,需要注意资源管理,比如数据库连接内存使用Disk Usage等。你必须清楚地知道如何释放不必要的资源持有量,否则会导致严重的问题。

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

      Spring Container 不仅适用于web 应用程序,它还可以服务于普通的java 应用程序(Main Application)。 Spring Container有两种不同的Bean TypeSingletonPrototype),Singleton Bean仅在Spring Container启动完成时预实例化,而Prototype Bean将通过每次调用getBean来实例化。

      有没有办法在不重启Application server的情况下重启spring IoC容器?

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

      希望能帮到你。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-13
          • 2013-02-09
          • 2010-10-12
          • 2014-12-22
          • 1970-01-01
          • 2017-11-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多