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

Spring Boot:无法访问Spring调度程序中的请求作用域bean

公孙河
2023-03-14

在我的Spring Boot应用程序中,我有一个调度器任务,每隔一小时执行一次。在调度器方法中尝试访问请求作用域bean。总是获取异常org.springframework.beans.factory.BeanCreationException。

下面是代码示例。

@Data
public class TestVo {
  private String message = "Hello";
}

@Bean
@Scope(value="request", proxyMode=ScopedProxyMode.TARGET_CLASS)
public TestVo testVo() {
    return new TestVo();
}
@Autowired
private TestVo testVo;

@Scheduled(cron="0 0 * * * *")
public void greetings() {
  System.out.println(testVo.getMessage()); // accessing request scope bean
}

会有帮助的..谢了。

共有1个答案

蒋烨然
2023-03-14

请求作用域bean被限定到特定的请求。每次请求来临时,都会创建一个新的实例,在请求完成后,它将被销毁。请求被绑定到一个线程,并使用该线程来处理请求(在非反应环境中)。即使有可能,调度器也不知道在这种情况下应该使用哪个请求对象。考虑到当计划的作业开始运行时,您有100个活动请求,它应该如何选择一个?或者,如果没有任何活动请求(因此上下文中没有实例?)。您可以通过代理将请求作用域注入到singleton中,因为singleton方法调用将在同一个请求线程上处理,但是调度的作业使用它自己的线程池,而线程池不限于任何请求。也许现在您可以看到在调度器中使用请求作用域bean的问题。如果希望在调度器和请求范围bean中使用相同的逻辑,可以将其提取到一个超类中。

 类似资料:
  • 我有一个Spring应用程序,它根据请求上下文注入某些bean。在这个例子中,它是Facebook bean。 此代码将正常运行,但偶尔会出现以下错误: 2017-02-09 01:39:59.133错误40802-[o-auto-1-exec-2]o.a.c.c.c.[/]。[dispatcherServlet]:Servlet。路径为[]的上下文中servlet[dispatcherServl

  • 我的spring boot应用程序中目前只有两个类。第一个是main主引导应用程序类,另一个是服务类。我在应用程序类中声明了如下属性源文件: 其他类是FTPService,其中属性值in使用@value,如下所示: 它打印空。也尝试用下面的注释来注释FTPService,但不起作用。尝试将属性复制到Application.properties,但不起作用。 我的属性文件在src/main/reso

  • 当我在我的设备(Galaxy Note 3和Ouya)上调试一个在Android Studio中编写的应用程序时,该应用程序调试良好,并在设备上运行,但是该应用程序从未出现在应用程序抽屉中,所以我无法在断开连接的设备上运行它(即当我的开发计算机离开时,向其他人显示正在运行的应用程序)。我的应用程序曾经安装为可运行的应用程序,但这似乎不再发生。然而,应用程序在应用程序管理器中被列为一个应用程序,我可

  • 本文向大家介绍请问Spring中Bean的作用域有哪些?相关面试题,主要包含被问及请问Spring中Bean的作用域有哪些?时的应答技巧和注意事项,需要的朋友参考一下 考察点:框架 参考回答: 在Spring的早期版本中,仅有两个作用域:singleton和prototype,前者表示Bean以单例的方式存在;后者表示每次从容器中调用Bean时,都会返回一个新的实例,prototype通常翻译为原

  • 我有一个带有spring框架的Java8应用程序。我们需要从应用程序中使用REST调用补丁操作。 代码片段如下: 请指教。

  • 我试图弄清楚spring是如何将线程安全的请求/会话范围的bean注入控制器组件(即通过方法访问这些bean的单线程和多线程)的 作为例子,考虑<代码> HttpServletRequest 字段,该控件标记为“代码> @ AutoWordEng/代码>注释(我知道将控制器与servlet API配对是不好的,但在学习目的上可以)。我了解到这样的bean是使用CGLib代理的,但仍然无法弄清楚代理