gpt4 book ai didi

java - 如何使用 AnnotationConfigWebApplicationContext 运行 SpringApplication?

转载 作者:行者123 更新时间:2023-12-02 14:37:11 24 4
gpt4 key购买 nike

我们有一个 SpringApplication 可以在默认的 ApplicationContext 中正常运行,但是我们有一个场景,我们需要刷新上下文,而默认上下文不允许我们执行此操作。我已经将我们的主应用程序类更新为如下所示:

// package and import lines not shown here but are included in original source

@ComponentScan("edge")
@EnableAutoConfiguration
@Configuration
@EnableTransactionManagement
@EnableAsync
@EnableScheduling
public class Application {

public static void main(String[] args) {

SpringApplication app = new SpringApplication(Application.class);
app.setApplicationContextClass(AnnotationConfigWebApplicationContext.class);
app.run(args);
}

使用此代码,调用 app.run(args) 会产生以下堆栈跟踪:

Exception in thread "main" java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext
at org.springframework.context.support.AbstractRefreshableApplicationContext.getBeanFactory(AbstractRefreshableApplicationContext.java:170)
at org.springframework.boot.context.event.EventPublishingRunListener.registerApplicationEventMulticaster(EventPublishingRunListener.java:70)
at org.springframework.boot.context.event.EventPublishingRunListener.contextPrepared(EventPublishingRunListener.java:65)
at org.springframework.boot.SpringApplication.run(SpringApplication.java:305)
at edge.server.Application.main(Application.java:43)

单步执行 SpringApplication.run(),我注意到上下文的 BeanFactory 为 null。如果我删除 app.setApplicationContextClass(AnnotationConfigWebApplicationContext.class) 行,从而将应用程序设置为使用默认上下文,则代码将一直运行到我们调用刷新() 的位置。该调用的结果是:

java.lang.IllegalStateException: GenericApplicationContext does not support multiple refresh attempts: just call 'refresh' once

有没有人按照我描述的方式在 SpringApplication 中使用 AnnotationConfigWebApplicationContext 并使其工作?如果是这样,您对让它发挥作用有什么建议吗?我尝试在调用 app.run() 之前寻找手动创建 BeanFactory 的方法,但似乎没有任何公共(public)方法可以执行此操作。预先感谢您提供的任何帮助!

编辑以澄清:

感谢迄今为止的评论和回答。我应该在原来的帖子中更明确地说明需要刷新 ApplicationContext 的场景以及我尝试使用 AnnotationConfigWebApplicationContext 的情况。我们有一些在服务器启动后运行的代码,用于备份和恢复目的,其中涉及修改我们正在使用的 JpaRepositories 的内容。我的理解是,运行此代码后,我们需要刷新 ApplicationContext 才能再次调用所有 init 方法。

尝试使用默认上下文类(AnnotationConfigEmbeddedWebApplicationContext,GenericApplicationContext 的子类)执行此操作会抛出我之前提到的 IllegalStateException(GenericApplicationContext 不支持多次刷新尝试:只需调用“刷新”一次 )。该异常促使我尝试将上下文显式设置为 AnnotationConfigWebApplicationContext,它是 AbstractRefreshableApplicationContext 的子类。我的假设是我需要应用程序使用 AbstractRefreshableApplicationContext 才能成功多次调用刷新方法。有没有办法让我上面的代码工作,或者我应该采取一些替代方法来允许我们多次刷新上下文?

最佳答案

您正在使用 Spring Boot,它已经为您完成了此操作,您只是让它变得过于复杂。将您的类(class)更改为以下内容。

@EnableAsync
@EnableScheduling
@SpringBootApplication
public class Application {

public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}

并确保它位于 edge 包中,并确保您具有启用 Web 应用程序的 spring-boot-starter-web 依赖项。无需自己搞乱上下文类。

关于java - 如何使用 AnnotationConfigWebApplicationContext 运行 SpringApplication?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30990885/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com