@Scope("prototype") bean scope not creating new bean
阿新 • • 發佈:2021-07-20
程式碼
@Controller public class HomeController { @Autowired private LoginAction loginAction; @RequestMapping(value="/view", method=RequestMethod.GET) public ModelAndView display(HttpServletRequest req){ ModelAndView mav = new ModelAndView("home"); mav.addObject("loginAction", loginAction); return mav; } public void setLoginAction(LoginAction loginAction) { this.loginAction = loginAction; } public LoginAction getLoginAction() { return loginAction; } }
@Component
@Scope("prototype")
public class LoginAction {
private int counter;
public LoginAction(){
System.out.println(" counter is:" + counter);
}
public String getStr() {
return " counter is:"+(++counter);
}
}
問題
為什麼將LoginAction 配置為 @Scope("prototype"),在 HomeController 呼叫的時候並沒有每次new一個例項出來?
原因
其實很簡單,LoginAction 是 @Scope("prototype"), 但 HomeController 並不是(預設是單例)。
@Scope("prototype") 意思是每次你向spring要一個instance的時候,它都會為你new一個。
解決
在本例中,如果每次呼叫都需要一個new一個instance的話,可以使用getBean方法。
context.getBean(..)
或者Spring 2.5之後,可以使用ScopedProxyMode控制
@Scope(value="prototype", proxyMode=ScopedProxyMode.TARGET_CLASS)
參考
https://stackoverflow.com/questions/7621920/scopeprototype-bean-scope-not-creating-new-bean