次のクラスがあるとします...
@Controller
public class WebController {
@Autowired PersonService personService;
@RequestMapping(value = "/get", method = RequestMethod.GET)
@ResponseBody
@Scope("session")
public List<Player> getPerson(String personName) {
return playerService.getByName(personName);
}
}
これにより、次のサービスが呼び出されます...
@Service("playerService")
public class PlayerServiceImpl implements PlayerService {
private List<Player> players;
@Override
@Transactional
public List<Player> getByName(final String name) {
if (players == null) {
players = getAll();
}
return getValidPlayers(name);
}
最初にアプリケーションを起動した場合、players は正しく null ですが、同じセッションで新しい値を指定してこのメソッドを再度呼び出すと、ご想像のとおり、players は null ではなくなりました。ただし、新しいスレッドが作成されているようには見えません。新しいブラウザー ウィンドウを開いて (新しいセッションを作成)、このメソッドを呼び出しても、前のセッションの値が保持されています。
@Scope("session") がスレッドプールに新しいスレッドを作成しないのはなぜですか?
サーブレット コンテキストで期待どおりに指定<context:component-scan base-package="com." />
しました。Java EE コンテナーのようにセッションごとに新しいスレッドを作成するのではなく、サービス メソッドがすべてシングルトンとして機能することを除けば、すべて正常に動作します。
プレイヤーが静的としてマークされていれば、理解できます。
また、コントローラーを次のようにマークしようとしましたが@Scope("session")
(以下に示すように)、これも影響がないようです。Spring アプリに新しいセッション用の新しいスレッドを作成させる最良の方法は何ですか?
@Controller
@Scope("session")
public class PlayerController {