1. ホーム
  2. spring

[解決済み] スコープ("prototype")ビーンスコープで新しいビーンが作成されない

2022-05-06 18:37:29

質問

アノテーションされたプロトタイプ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;
    }
    }

Velocityテンプレートです。

 LoginAction counter: ${loginAction.str}

config.xml はコンポーネントスキャンを有効にしています。

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

毎回カウントがインクリメントされるんだけど。どこが悪いのかわかりません。

更新

として 提案者:@gkamal を作成しました。 HomeController webApplicationContext -を意識させることで、問題を解決しました。

のコードを更新しました。

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

解決方法は?

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

この例では、LoginActionの新しいインスタンスが作成され、HomeControllerに注入されます。もし別のコントローラで LoginAction を実行すると、別のインスタンスが作成されます。

呼び出しごとに異なるインスタンスが必要な場合は、毎回getBeanを呼び出す必要があります - シングルトンBeanに注入してもそれは達成されません。