2015-06-18 40 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完全分開。這與在處理程序方法中使用表單參數的過程相同。

額外閱讀:

相關問題