我注意到我的原型作用域Spring bean的@predestroy
钩子没有得到执行。
那是什么意思?文本向我建议,作为程序员,我有责任显式地(手动地)销毁我的原型bean。这是正确的吗?如果是,我该怎么做?
为了其他人的利益,我将在下面介绍我从调查中收集到的信息:
只要原型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。我的问