Хранить временные данные в Spring Controller - PullRequest
0 голосов
/ 02 июля 2018

Мне интересно, смогу ли я сохранить временные данные в атрибуте класса Controller. Мое сомнение связано с вызовами параллелизма. Давайте, например, рассмотрим следующий код:

@Controller
public class TestController {
    @Autowired
    private TestService testService;

    @Autowired
    private OtherService otherService;

    private final HashMap<Integer, Test> testMap = new HashMap<Integer, Test>();

    @RequestMapping(value = "test")
    @ResponseBody
    public List<Test> test() {
        List<Test> list = new ArrayList<Test>();
        for (final OtherTest otherTest : otherService.getAll()) {
            Integer key = otherTest.getId();
            final Test t;
            if(testMap.containsKey(key)) {
                t = testMap.get(key);
            } else {
                t = testService.getByOtherTestId(key);
            }
            list.add(t);
        }
    }
}

Я знаю, что Controllers - это Beans, и я знаю, что Beans - это Singleton, поэтому:

Что произойдет, если два пользователя вызовут метод test одновременно? Каждый из них читает / пишет один и тот же testMap объект? Когда объект testMap потеряет свою область видимости и будет восстановлен?

Спасибо

1 Ответ

0 голосов
/ 02 июля 2018

Да, два запроса будут манипулировать одним и тем же объектом testMap. Если вы хотите создать новый Map для каждого запроса, вы можете создать для него bean-компонент в одном из ваших классов конфигурации:

@Bean
@RequestScope // or @Scope("request")
public Map<Integer, Test> testMap() {
    return new HashMap<>();
}

и автоматически подключите его в вашем контроллере:

@Autowired
private Map<Integer, Test> testMap;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...