4

Count.java:

@Component
@Scope(value = "session",proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Count {
    Integer i;
    public Count() {
        this.i = 0;
    }

コントローラ:

@Controller
public class GreetingController {
    @Autowired private Count count;
    @RequestMapping("/greeting")
    public String greetingForm(Model model) {
        if(count.i == null) i == 0;
        else i++;
        model.addAttribute("count",String.valueOf(count.i));
        return "greeting";
    }
}

しかし、このコントローラー (/greeting) を実行するたびに、ブラウザーを閉じても i が常に増加するため、シングルトン コントローラーでこのセッション スコープ コンポーネントを使用するにはどうすればよいですか?

4

1 に答える 1

14

プロキシはメソッド呼び出しのみをインターセプトします。あなたの場合、次のことが起こります:

@Autowired private Count count;

count のインスタンスのように見えるため、フィールドも持つプロキシを作成しますi。しかし、プロキシは本物ではないため、Countコンストラクターは呼び出されず、初期化されていませんi。それがあなたがいつも得る理由ですnull

それでは、ゲッターを紹介しましょう。

class Count {
  ...
  public Integer getI() {
    return i;
  }

プロキシを呼び出すと、現在のセッションの BeangetI()のインスタンスがあるかどうかが最初にチェックされます。Count存在しない場合は作成されます。これは、Countコンストラクターが呼び出され、i現在初期化されていることも意味します。getI()次に、プロキシは、 の値を返すBean への呼び出しを委任しますi

于 2016-09-14T11:56:26.137 に答える