gpt4 book ai didi

java - RestController 方法注入(inject)不支持单例(Annotation Driven)

转载 作者:行者123 更新时间:2023-11-29 03:08:10 29 4
gpt4 key购买 nike

文档说 Spring 的默认 bean 作用域是单例。

我找不到任何关于绕过此范围的方法级注入(inject)的信息。

有了这个配置

@Configuration
public class ApplicationConfiguration {
@Bean
public ModuleProvider getModuleProvider() {
return new ModuleProvider();
}
}

方法一(我期望这两种结果):

@RestController
@Scope(value = "request")
@RequestMapping(value = "/application")
public class ApplicationController {
@Autowired
ModuleProvider moduleProvider;

@RequestMapping
public String showModules() {
return moduleProvider.toString();
}
}

点击两次,输出是..

application.ModuleProvider@673f63cb
application.ModuleProvider@673f63cb

方法二:

@RestController
@Scope(value = "request")
@RequestMapping(value = "/application")
public class ApplicationController {
@Autowired
@RequestMapping
public String showModules(ModuleProvider moduleProvider) {
return moduleProvider.toString();
}
}

点击两次,输出是..

application.ModuleProvider@1cc4fbcb
application.ModuleProvider@57248dbf

最佳答案

(在你的第二种情况下,你实际上应该看到它三次。)

@Autowired 仅在创建 bean 时处理,并且必须注入(inject)字段或方法。

在准备您的ApplicationController bean 时,Spring 将找到用@Autowired 注释的showModules 方法,并通过注入(inject)ModuleProvider 来调用它 来自 @Configuration 类的 bean。

之后,Spring 完成了对ApplicationController 的注入(inject)。

当您随后发送请求时,Spring MVC 接管。这完全忽略了 @Autowired。默认情况下, Controller 类型中 @RequestMapping 注释方法的参数由 HandlerMethodArgumentResolver 处理。在这种情况下,ModelAttributeMethodProcessor 类型的实例(或其 ServletModelAttributeMethodProcessor 子类)将为 ModuleProvider 类型的参数生成参数。

每次都会创建一个新的。这些实例完全独立于 ApplicationContext。这与在您的处理程序方法中使用表单参数的过程相同。

补充阅读:

关于java - RestController 方法注入(inject)不支持单例(Annotation Driven),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30919823/

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