如果Singleton崩溃,如何在Spring上重新创建一个Singleton bean?

时间:2016-07-16 23:14:30

标签: java spring spring-mvc

我有2个带@Scope的bean(值= WebApplicationContext.SCOPE_APPLICATION,proxyMode = ScopedProxyMode.TARGET_CLASS)

这两个豆子是单身人士。有时它们会根据并发请求的数量而崩溃。如果它们崩溃,并且我验证它们具有空值,我该如何重新创建它们并刷新上下文?或者它是危险的,缓慢的还是容易出现进一步的错误?

此外,创建Singleton以使其更稳定的最佳方法是什么?通过工厂?

我在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.RELEASE。

谢谢,

下进行。

2 个答案:

答案 0 :(得分:0)

我对春天或豆子不太了解,但我不确定你对单身豆的意思是什么"崩溃"。也许你的意思是应用程序容器崩溃,因此你的整个服务器都崩溃了,这会让你失去任何非持久化的对象状态。如果这就是你的意思,你应该以某种方式保存你的bean的状态并在之后重新加载它,并且还要研究使你的服务器/应用服务器崩溃的问题。

如果你的意思是别的,那么我会说你的单例bean引用只是被空值覆盖,而不是"崩溃"。这可能是一个错误。

根据我对豆类的理解并阅读有关Spring的内容,如果您没有指定范围(因为您没有),它将成为Singleton范围。这意味着Spring框架将只创建一个bean实例。我想你不应该自己实例化这个类,所以你不应该为任何东西都需要myFinderModels()方法。您可能正在使用此方法替换对原始bean的引用。

所以,回答你的问题:我不认为你应该担心创造而不是重新创造你的单身。专注于让你的bean配置正确,找到你可能会搞乱其引用的地方并解决它。

答案 1 :(得分:0)

如果你的 Singleton 崩溃了,整个 Spring 启动都会失败。通常它会导致应用程序无法启动。 如果您的 Singleton 初始化可能失败(您正在创建 MyFinderModels 实例,但此时数据提供程序不可用),您应该推迟相应 Singleton 属性的初始化。 例如,您可以创建一个计时器事件,该事件将在一些延迟后执行并再次尝试初始化所需的数据,并且此事件将一次又一次地执行,直到数据被初始化。当然,myFinderModels 的任何使用者都应该期望 null 而不是模型,并且您应该考虑 myFinderModels() 中可能出现的异常——要么在 myFinderModels() 中捕捉它们,要么每个使用者都应该捕捉到这些异常。