2015-06-18 39 views
1

该文档说明Spring的默认bean作用域是单例。RestController方法注入不支持单例(注释驱动)

我无法找到绕过此范围的任何方法级别注射。

利用这种配置

@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(); 
    } 
} 

击中它两次,则输出为..

[email protected] 
[email protected] 

方法二:

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

击中了两次,输出的是..

[email protected] 
[email protected] 

回答

3

(你应该真正看到它三次在你的第二个案例。)

@Autowired创建bean时,才处理,而且必须有注入的字段或方法。

当您准备ApplicationController豆,春天会发现showModules@Autowired注解,并通过注入来自@ConfigurationModuleProvider豆调用它。

之后,春天完成注射ApplicationController

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

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

额外阅读:

相关问题