Объем RestController и Controller в Spring

Какой должна быть область действия Controller и RestController в приложении Spring? Поведение по умолчанию, если это Singleton. Но не будет единого bean-компонента, пересекающего запрос / ответы от нескольких клиентов, так как наш контроллер будет вызывать какой-то другой bean-компонент (скажем, @Service), который обрабатывает пользовательский запрос (например, получение сведений о пользователе из БД или из другой службы REST / SOAP) .

0
0
551
1

Ответы 1

У вас есть два варианта:

Вариант 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.
    }
}

Другие вопросы по теме