当前位置: 首页 > 知识库问答 >
问题:

Spring原型bean需要手动销毁吗?

濮阳功
2023-03-14

我注意到我的原型作用域Spring bean@predestroy钩子没有得到执行。

那是什么意思?文本向我建议,作为程序员,我有责任显式地(手动地)销毁我的原型bean。这是正确的吗?如果是,我该怎么做?

共有1个答案

松阳泽
2023-03-14

为了其他人的利益,我将在下面介绍我从调查中收集到的信息:

只要原型bean本身不包含对另一个资源(如数据库连接或会话对象)的引用,那么一旦删除了对该对象的所有引用或该对象超出范围,它就会得到垃圾回收。因此,通常没有必要显式销毁原型bean。

但是,在如上所述可能发生内存泄漏的情况下,可以通过创建一个单例bean后处理器来销毁原型bean,该后处理器的销毁方法显式调用原型bean的销毁钩子。因为后处理器本身属于单例范围,所以Spring将调用它的破坏钩子:


3。最后,在每个原型bean中实现DisposableBean接口,提供该契约所需的Destroy()方法。

为了说明这一逻辑,我提供了以下摘自本文的一些代码:

/**
* Bean PostProcessor that handles destruction of prototype beans
*/
@Component
public class DestroyPrototypeBeansPostProcessor implements BeanPostProcessor, BeanFactoryAware, DisposableBean {

    private BeanFactory beanFactory;

    private final List<Object> prototypeBeans = new LinkedList<>();

    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        if (beanFactory.isPrototype(beanName)) {
            synchronized (prototypeBeans) {
                prototypeBeans.add(bean);
            }
        }
        return bean;
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = beanFactory;
    }

    @Override
    public void destroy() throws Exception {
        synchronized (prototypeBeans) {
            for (Object bean : prototypeBeans) {
                if (bean instanceof DisposableBean) {
                    DisposableBean disposable = (DisposableBean)bean;
                    try {
                        disposable.destroy();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            }
            prototypeBeans.clear();
        }
    }
}
 类似资料:
  • 在另一个项目中实现之前,我一直试图按照这里的教程设置演示,以帮助我理解本地机器上的SSO。我遇到了一个使我陷入困境的问题。我收到错误通知我添加一个bean。请让我知道我缺少了什么代码。我无法使程序运行。 文件系统树 authApplication.java 应用程序.属性 给出错误(不是运行的全部控制台输出,但这是错误)

  • 上面的bean看起来像一个集合的原因是基于外部配置文件动态地创建生产者。对于没有集合的bean,可以通过注释上的destroyMethod属性轻松完成: 是否可以在集合bean上提供destroy方法?作为一种变通方法,我可以创建一个单独的类,它只包装一个集合并有一个close方法,但我不想为每个集合bean创建类。

  • 本文向大家介绍vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么?相关面试题,主要包含被问及vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么?时的应答技巧和注意事项,需要的朋友参考一下 [vue] vue组件里写的原生addEventListeners监听事件,要手动去销毁吗?为什么?

  • 问题内容: 我试图将一个bean 注入一个bean中,以便对单例bean方法的每个新调用都具有原型bean的新实例。 考虑如下的单例豆: 我希望每次调用该方法时,都会使用一个新实例。 下面是原型bean: 似乎正在发生的事情是,Spring急于在该方法中交付PrototypeBean的新实例。也就是说,该方法中的两行代码将在每一行中创建一个prototypeBean的新实例。 因此,在第二行中,输

  • 问题是在达到会话超时之前不会销毁会话范围的bean。 因此,对于以下注销程序,我有两个问题: 这是使用shiro注销的正确方法吗(请参阅下面的logout()) 注销期间销毁CDI会话范围bean的正确方法是什么。 page.xhtml: null 豆类: shiro.ini: 例外情况: 调用时引发以下异常 附加信息:我正在运行WildFly8.2.0.final。 多谢了。

  • 我正在使用一些现有的代码,它正在做我以前没有见过的事情。我已经处理了使用方法注入将原型bean自动转换为单例,或者使用getBean()从上下文中获取bean。我在这段代码中看到的是一个bean,它是一个原型,使用getBean()检索,它具有自动连接的依赖关系。这些大部分都是单例bean,这是有道理的。但是有另一个原型bean的自动生成,从我所看到的情况来看,它似乎得到了一个新的bean。我的问