@Scope("prototype") Beanスコープが新しいBeanを作成しない 質問する

@Scope(

コントローラーでアノテーション付きのプロトタイプ Bean を使用したいのですが、Spring は代わりにシングルトン Bean を作成します。そのコードは次のとおりです。

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

速度テンプレート:

 LoginAction counter: ${loginAction.str}

Spring ではconfig.xmlコンポーネント スキャンが有効になっています。

    <context:annotation-config />
    <context:component-scan base-package="com.springheat" />
    <mvc:annotation-driven />

毎回カウントが増えていきます。どこが間違っているのかわかりません。

アップデート

として@gkamal が提案HomeController webApplicationContext-aware を作成して問題を解決しました。

更新されたコード:

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

ベストアンサー1

スコープ プロトタイプとは、Spring (getBean または依存性注入) にインスタンスを要求するたびに、新しいインスタンスが作成され、そのインスタンスへの参照が提供されることを意味します。

この例では、 LoginAction の新しいインスタンスが作成され、 HomeController に注入されます。LoginAction を注入する別のコントローラーがある場合は、別のインスタンスが取得されます。

呼び出しごとに異なるインスタンスが必要な場合、そのたびに getBean を呼び出す必要があります。シングルトン Bean に注入してもそれは実現できません。

おすすめ記事