gpt4 book ai didi

java - 确保从非 spring 上下文加载 spring bean

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:51:17 27 4
gpt4 key购买 nike

我在(jersey 2.6 类和)servlet 旁边有 spring 应用程序。

我需要从 jersey/ 非 spring 上下文中获取 Spring bean,

类似question建议在上下文的静态包装器中获取上下文

public static ApplicationContext getContext() {
return context;
}

我如何确定上下文已经加载或不为空?

如果我不能,我应该如何等待/检查直到加载 spring 上下文?

如果从 jersey 上下文调用或从 调用 bean,一个简单的 HttpServlet 代码

编辑

Jersey 使用 jersey-spring3 依赖 jar 工作正常,所以我的问题只是关于不受 Spring 控制的 Servlet

编辑 2

应用程序正在加载不同于@entpnerd 建议的 Spring article

它注册一个实现 WebApplicationInitializer

的 Servlet
public class MyWebAppInitializer implements WebApplicationInitializer {

而且在web.xml中配置了DispatcherServlet

DispatcherServlet如何只在Spring加载后加载?

因为我们在它的 init 方法上添加了 Autowiring 功能:

WebApplicationContextUtils.getRequiredWebApplicationContext(config.getServletContext())
.getAutowireCapableBeanFactory().autowireBean(this);

在服务请求之前添加超时是最优选的解决方案,还是在类加载中有一个调整可以解决这个问题?

编辑 3

我找到了 answersanswers注入(inject),但不是为什么 Spring 在 Servlet 之前加载。

最佳答案

这个想法很简单,尽管实际的实现可能会因 Spring boot 和 Jersery 初始化的具体方式而有所不同。

一个想法:

Spring Boot 作为一个纯粹的运行时框架,就是正确加载应用程序上下文(从问题的角度来看)。

所以,最重要的是,当它被加载时,内存中某处有一个应用程序上下文,并且可以从该应用程序上下文访问 bean。

现在,既然你说 Jersey 不是 spring/spring-boot 驱动的,那么 Jersey 必须从某种静态全局变量访问这个应用程序上下文,这很丑陋但应该可以工作。

所以这个想法有两个步骤:

  1. 将应用程序上下文引用放到一些可从 Jersey 访问的静态持有者。
  2. 从 Jersey 组件的一些基础设施级代码中读取这个值。

一个可能的实现

从技术上讲,第一步可以通过实现某种 spring boot 监听器来完成,它将应用程序上下文存储在某种单例中:

enum ApplicationContextHolder {
INSTANCE;
private ApplicationContext ctx;
void setApplicationContext(ApplicationContext ctx) {
this.ctx = ctx;
}

ApplicationContext getCtx() {
return this.ctx;
}

}


// and a listener (spring boot provides many ways to register one, but the
// implementation should be something like this):
// The main point is that its managed by spring boot, and hence and access to
// the application context
class StartupListener implements ApplicationListener<ContextRefreshedEvent> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
ApplicationContextHolder
.INSTANCE
.setApplicationContext(event.getApplicationContext());
}
}

现在第 2 步是:

class MyJerseyOrWhateverComponentThatWantsToAccessApplicationContext {

public void foo() {
ApplicationContext ctx = ApplicationContextHolder.INSTANCE.getCtx();
...
ctx.getBean(...);
}
}

关于java - 确保从非 spring 上下文加载 spring bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47434743/

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