Java RestController方法注入不';不支持单例(注释驱动)

Java RestController方法注入不';不支持单例(注释驱动),java,spring,Java,Spring,文档中说Spring的默认bean范围是一个单例 我找不到任何关于绕过此范围的方法级注入的信息 使用此配置 @Configuration public class ApplicationConfiguration { @Bean public ModuleProvider getModuleProvider() { return new ModuleProvider(); } } 方法一(我期望这两种结果): 点击两次,输出为 application.M

文档中说Spring的默认bean范围是一个单例

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

使用此配置

@Configuration
public class ApplicationConfiguration {
    @Bean
    public ModuleProvider getModuleProvider() {
        return new ModuleProvider();
    }
}
方法一(我期望这两种结果):

点击两次,输出为

application.ModuleProvider@673f63cb
application.ModuleProvider@673f63cb
application.ModuleProvider@1cc4fbcb
application.ModuleProvider@57248dbf
方法二:

@RestController
@Scope(value = "request")
@RequestMapping(value = "/application")
public class ApplicationController {
    @Autowired   
    @RequestMapping
    public String showModules(ModuleProvider moduleProvider) {
        return moduleProvider.toString();
    }
}
点击两次,输出为

application.ModuleProvider@673f63cb
application.ModuleProvider@673f63cb
application.ModuleProvider@1cc4fbcb
application.ModuleProvider@57248dbf
(在第二种情况下,您应该实际看到它三次。)

@Autowired
仅在创建bean时处理,并且必须插入字段或方法

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

在这之后,Spring将通过
ApplicationController
的注入完成

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

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

额外阅读:

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

      @Autowired
      仅在创建bean时处理,并且必须插入字段或方法

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

      在这之后,Spring将通过
      ApplicationController
      的注入完成

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

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

      额外阅读: