java.lang.IllegalStateException: BeanFactory not initialized or already closed - call ‘refresh‘ befo

在开发过程中遇到java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext,下面我们来分析一下到底怎么解决这个问题。

1. 问题描述

Spring 框架被广泛应用于企业级应用程序的开发。其中,BeanFactory 负责管理和创建 Java Bean。然而,有时我们可能会遇到以下异常:

java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext

这个异常表示在访问 ApplicationContext 中的 bean 时,BeanFactory 尚未初始化或已经关闭。导致这个异常的原因主要有两个:

  • 没有调用 refresh() 方法来初始化 BeanFactory。
  • 在已经关闭的 ApplicationContext 中尝试访问 bean。

接下来,我们将分别介绍每个原因,并提供相应的解决方案。

2. 原因一:没有调用 refresh() 方法

在使用 ApplicationContext 创建 BeanFactory 的时候,如果没有显式调用 refresh() 方法,可能会导致 BeanFactory 未被初始化的问题。

为了解决这个问题,我们需要在创建 ApplicationContext 后立即调用 refresh() 方法。下面是一个示例代码:

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(AppConfig.class);
        context.refresh(); // 初始化 BeanFactory
        // 其他代码
    }
}

在上述代码中,我们通过 AnnotationConfigApplicationContext 创建了一个 ApplicationContext,并注册了一个配置类。调用 refresh() 方法后,BeanFactory 将被正确初始化,避免了异常的发生。

3. 原因二:在已关闭的 ApplicationContext 中访问 bean

另一种常见的原因是,当 ApplicationContext 被关闭后,我们仍然尝试访问 bean。这可能是由于在应用程序的生命周期中调用了不正确的方法,或者由于并发访问的问题。

为了解决这个问题,我们需要确保只在 ApplicationContext 是活动状态时访问 bean。下面是一个示例代码:

import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class Application {
    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(AppConfig.class);
        context.refresh();

        // 执行业务逻辑

        context.close(); // 关闭 ApplicationContext
    }

    public void performBusinessLogic() {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.register(AppConfig.class);
        context.refresh();

        // 访问 bean 的代码

        context.close(); // 关闭 ApplicationContext
    }
}

在上面的示例代码中,我们通过在合适的时机调用 context.close() 方法,确保了 ApplicationContext 在不需要时被关闭。通过这种方式,我们就可以避免在已关闭的 ApplicationContext 中访问 bean 而导致异常。

4. 结论

在开发过程中,遇到这个异常时,我们可以先检查是否调用了 refresh() 方法来初始化 BeanFactory。另外,注意在正确的时机关闭 ApplicationContext,避免在已关闭状态下访问 bean。

猜你喜欢

转载自blog.csdn.net/javamendou/article/details/131636325