假设我有以下课程......
@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 正确地为空,然后在同一个会话中,我再次使用新值调用此方法,players 不再为空,正如您所期望的那样。但是,似乎没有创建新线程,如果我打开一个新的浏览器窗口(因此创建一个新会话)并调用此方法,它仍然具有上一个会话的值。
为什么@Scope("session") 不在线程池中创建新线程?
我已经指定<context:component-scan base-package="com." />
按预期在我的 servlet-context 中指定了,除了服务方法都充当单例之外,一切正常,而不是像 Java EE 容器那样为每个会话创建一个新线程。
如果玩家被标记为静态,我会理解。
我也尝试将我的控制器标记为@Scope("session")
(如下所示),但这似乎也没有影响。让我的 Spring 应用程序为新会话创建新线程的最佳方法是什么?
@Controller
@Scope("session")
public class PlayerController {