Какой должна быть область действия Controller и RestController в приложении Spring? Поведение по умолчанию, если это Singleton. Но не будет единого bean-компонента, пересекающего запрос / ответы от нескольких клиентов, так как наш контроллер будет вызывать какой-то другой bean-компонент (скажем, @Service), который обрабатывает пользовательский запрос (например, получение сведений о пользователе из БД или из другой службы REST / SOAP) .
У вас есть два варианта:
Вариант 1. Убедитесь, что в ваших классах обслуживания вы не сохраняете какие-либо детали запроса в переменных экземпляра. Вместо этого передайте их как аргументы метода.
Бывший:
Приведенный ниже код повредит значение, хранящееся в userId, если будут одновременные запросы.
@Service
public class SomeService {
String userId;
public void processRequest(String userId, String orderId) {
this.userId = userId;
// Some code
process(orderId);
}
public void process(String orderId) {
// code that uses orderId
}
}
Пока следующий код безопасен.
@Service
public class SomeService {
private String userId;
public void processRequest(String userId, String orderId) {
// Some code
process(userId, orderId);
}
public void process(String userId, String orderId) {
// code that uses userId and orderId
}
}
Вариант 2:
Вы можете сохранить данные, специфичные для запроса, в bean-компонентах с ограниченным объемом запроса и внедрить их в свои синглтоны. Spring создает прокси для внедренных bean-компонентов с ограниченным объемом запросов и передает вызовы bean-компоненту, связанному с текущим запросом.
@RequestScoped
class UserInfo {
}
@Service
class UserService {
@Autowired
private UserInfo userInfo;
public void process(String orderId) {
// It is safe to invoke methods of userInfo here. The calls will be passed to the bean associated with the current request.
}
}