为了他人的利益,我将在下面介绍我从调查中收集到的内容:
只要原型bean本身不持有对另一个资源(如数据库连接或会话对象)的引用,只要删除了对该对象的所有引用或对象超出范围,就会立即收集垃圾.因此,通常没有必要显式销毁原型bean.
但是,在如上所述可能发生内存泄漏的情况下,可以通过创建单一bean后处理器来销毁原型bean,其后处理方法显式调用原型bean的销毁挂钩.因为后处理器本身是单例范围的,所以Spring会调用它的破坏钩子:
>创建一个bean post处理器来处理所有原型bean的销毁.这是必要的,因为Spring不会破坏原型bean,因此代码中的任何@PreDestroy挂钩永远不会被容器调用.
>实现以下接口:
1.BeanFactoryAware
该接口提供了一个接收Beanfactory对象的回调方法.此BeanFactory对象在后处理器类中用于通过其BeanFactory.isPrototype(String beanName)方法标识所有原型bean.
2. DisposableBean
此接口提供Spring容器调用的Destroy()回调方法.我们将在此方法中调用所有原型bean的Destroy()方法.
3. BeanPostProcessor
实现此接口提供对进程内回调的访问,我们在其中准备内部List<> Spring容器实例化的所有原型对象.我们稍后将遍历此List<>销毁我们的每个原型bean.
??3.最后在每个原型bean中实现DisposableBean接口,提供此契约所需的Destroy()方法.
为了说明这个逻辑,我提供了以下从article中获取的一些代码:
/**
* Bean PostProcessor that handles destruction of prototype beans