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

如果单例崩溃,如何在spring上重新创建一个单例bean?

全心思
2023-03-14

我有两个带有@scope的bean(value=html" target="_blank">webapplicationcontext.scope_application,proxyMode=scopedproxymode.target_class)

那两个豆子是单子。有时它们会崩溃,这取决于并发请求的数量。如果它们崩溃,并且我验证它们有空值,我如何重新创建它们并刷新上下文?或者它会是危险的、缓慢的并且容易发生进一步的错误?

此外,什么是最好的方法来创建一个单例,使其更加稳定?通过工厂?

我在RootContextConfiguration类中有以下bean声明:

@Scope(value = WebApplicationContext.SCOPE_APPLICATION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public MyFinderModels myFinderModels() {
    MyFinderModels myFinderModels = new MyFinderModels();
    return myFinderModels;
}

在我的RootContextConfiguration类上声明的。

@Configuration
@EnableScheduling
@EnableLoadTimeWeaving
@EnableAsync(
    mode = AdviceMode.PROXY, proxyTargetClass = true,
    order = 1
)
@ComponentScan(basePackages = {"com.mydomain.api.service","com.mydomain.api.repositories"}, excludeFilters = @ComponentScan.Filter({
    Controller.class, ControllerAdvice.class }))
@ImportResource({ "classpath:com/mydomain/config/securityConfiguration.xml" })
public class RootContextConfiguration implements AsyncConfigurer,
    SchedulingConfigurer { .....

如果Bean MyFinderModels崩溃,它将变为null。所以,在那个案子上,最好的办法是什么?在ApplicationContext级别重新创建它,或者我应该有一个更好的工厂来初始化bean并在它崩溃时处理它,以便它可以恢复?

它不是每次都崩溃,但当它崩溃时,我需要重新启动我的容器。

我使用的是spring 4.2.3版。

谢谢,

C..

共有1个答案

孔礼骞
2023-03-14

我不太了解spring或豆子,但我不知道你说的一个单一的豆子“崩溃”是什么意思。也许您的意思是应用程序容器崩溃,从而导致整个服务器崩溃,这将使您丢失任何非持久化对象状态。如果您的意思是这样的,那么您可能应该以某种方式保存bean的状态,然后重新加载它,并且还要研究导致服务器/应用程序服务器崩溃的问题。

如果您的意思是别的,那么我会说您的单例bean引用只是被一个空值覆盖,而不是“崩溃”。那可能是个虫子。

根据我对bean的理解和对spring的了解,如果您没有指定作用域(就像您没有指定的那样),那么它将是单例作用域。这意味着spring框架将只创建bean的一个实例。我想您不应该自己实例化这个类,所以您不应该需要myFinderModels()方法做任何事情。您可以使用此方法替换对原始bean的引用。

所以,回答你的问题:我认为你不应该担心创造,更不应该担心重新创造你的单品。集中精力使bean配置正确,找出您可能在哪里弄乱了它的引用,并修复它。

 类似资料:
  • 问题内容: 我有一个自动相互连接的Spring bean图。大大简化了图示: 所有这些bean都没有指定范围,这暗示它们是单例(使它们成为显式单例不会改变任何东西,我已经尝试过)。 问题在于,在实例化 单个应用程序上下文之后 ,的实例和包含的 不同 实例。怎么会这样 我试图为它创建public no args构造函数,并且调试已确认创建了多次。所有这些创建的堆栈跟踪都在这里。 我还尝试过为Spri

  • 我有一张相互自动连线的Spring豆图。高度简化的插图: 所有这些bean都没有指定作用域,这意味着它们是单例(我已经尝试过了,让它们显式单例不会改变任何东西)。 问题是,在实例化单个应用程序上下文之后,Bar和Baz的实例包含不同的Foo实例。这怎么会发生? 我尝试为创建公共no args构造函数,并且调试已确认已多次创建。所有这些创建的堆栈跟踪都在这里。 我还尝试为Spring启用调试日志记录

  • 我需要在Swift中创建一个singleton类。谁能帮我查一下密码吗?我已经知道,单例类在创建泛型代码方面非常有用。

  • 问题内容: 在Java中创建单例类的最佳/正确方法是什么? 我发现的实现之一是使用私有构造函数和getInstance()方法。 但是在以下测试案例中实现失败吗? 如何解决呢? 谢谢 问题答案: 根据对您的问题的评论: 我有一个包含一些键值对的属性文件,这是整个应用程序所需要的,这就是为什么我在考虑单例类。 此类将从文件中加载属性并将其保留,您可以在应用程序中的任何位置使用它 不要使用单例。您显然

  • 我目前有一个简单的bean作为pojo,我正在将其注入到工作线程中,工作线程是用定义的。 我发现bean被正确地注入到原型中,被重新初始化,并且所有的值都返回。 下面是注入的代码: POJO: } 我知道bean正在重新创建,因为调试器中的ID发生了变化,并且被打印到控制台。 用这种方式将单例注入到原型中有什么问题吗? 多谢了。

  • 问题内容: 编辑已 解决 :如何在GoLang中创建单例DBManager类。 我参考了一些有关如何创建单例的代码示例,但是我希望在其中包含方法,并在其单例引用中对其进行调用。我的代码如下 通过新答案,我更新了此问题,包括答案。 但是我有一些疑问。如何从gorm.Create(..)进行Cathc并返回异常 问题答案: 一种方法是使用这些方法创建一个导出的接口,并使实现类型不导出。创建接口类型的全