2015-10-15 10 views
8

I以下Springコントローラがあります。Spring MVCのRestController範囲

package hello; 

import java.util.concurrent.atomic.AtomicLong; 

import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestParam; 
import org.springframework.web.bind.annotation.RestController; 

@RestController 
public class TestController { 
    private final AtomicLong counter = new AtomicLong(); 

    @RequestMapping("/test") 
    public String test() { 
     long val = counter.incrementAndGet(); 
     return String.valueOf(val); 
    } 
} 

私はREST APIにアクセスするたびに、それがインクリメント値を返します。 私はちょうどJavaを学んでいて、理由が来るたびにAtomicLongの新しいインスタンスが作成されている必要があるため、常に1を返すとは限りません。

+2

なぜ新しいインスタンスが作成されていると思いますか? – chrylis

+0

@chrylis:私はもともと.netの背景から来て、ちょうどそれとの比較を持っていました。 –

答えて

9

いいえ、TestController beanは実際にはシングルトンです。 @RestControllerアノテーションは、範囲がデフォルトでSINGLETONである@Componentの春を宣言します。これは、@Scope注釈に記載されています。

デフォルトでは、SCOPE_SINGLETONを意味する空の文字列( "")になります。

これは、すべての要求を処理するTestControllerの同じインスタンスになることを意味します。 counterはインスタンス変数であるため、すべての要求で同じになります。

+0

シングルトンのままにしたり、スコープをいわゆる「プロトタイプ」に設定するのは良い方法ですか? –

+0

@BabuJames 'コントローラ'の場合は、シングルトンにする方が良いと言います。 'コントローラ'は通常はステートフルではないので、シングルトンにするのが理にかなっています。 – Tunaki

2

@RestControllerはリクエストごとに作成されません。要求ごとに同じままです。したがって、あなたのcounterはその値を保持し、毎回増分されます。