@Scope("prototype") bean scope not creating new bean

spring, spring-mvc

Solution

Scope prototype means that every time you ask spring (getBean or dependency injection) for an instance it will create a new instance and give a reference to that.

In your example a new instance of LoginAction is created and injected into your HomeController . If you have another controller into which you inject LoginAction you will get a different instance.

If you want a different instance for each call - then you need to call getBean each time - injecting into a singleton bean will not achieve that.

Problem

I want to use a annotated prototype bean in my controller. But spring is creating a singleton bean instead. Here is the code for that: ``` @Component @Scope("prototype") public class LoginAction { private int counter; public LoginAction(){ System.out.println(" counter is:" + counter); } public String getStr() { return " counter is:"+(++counter); } } ``` Controller code: ``` @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; } } ``` Velocity template: ``` LoginAction counter: ${loginAction.str} ``` Spring `config.xml` has component scanning enabled: ``` <context:annotation-config /> <context:component-scan base-package="com.springheat" /> <mvc:annotation-driven /> ``` I'm getting an incremented count each time. Can't figure out where am I going wrong! Update As suggested by @gkamal, I made `HomeController` `webApplicationContext`-aware and it solved the problem. updated code: ``` @Controller public class HomeController { @Autowired private WebApplicationContext context; @RequestMapping(value="/view", method=RequestMethod.GET) public ModelAndView display(HttpServletRequest req){ ModelAndView mav = new ModelAndView("home"); mav.addObject("loginAction", getLoginAction()); return mav; } public LoginAction getLoginAction() { return (LoginAction) context.getBean("loginAction"); } } ```

Original source