关于我们

质量为本、客户为根、勇于拼搏、务实创新

< 返回

@Scope(&quot;prototype&quot;)beanscopenotcreatingnewbean

发布时间:2022-07-27 13:54:55

代码

@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一个实例出来?@Scope("pro
totype")beanscopenotcreatingnewbean

原因

其实很简单,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


/template/Home/Dawn/PC/Static

选择风纳云,也许是您成就一番大事业的开端

注册账号