【问题标题】:RestController method injection doesn't support singleton (Annotation Driven)RestController 方法注入不支持单例(注解驱动)
【发布时间】:2015-06-18 15:35:59
【问题描述】:

文档说 Spring 的默认 bean 范围是单例。

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

有了这个配置

@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

【问题讨论】:

    标签: java spring


    【解决方案1】:

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

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

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

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

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

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

    补充阅读:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-10
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多