#spring #spring-boot #spring-data
Вопрос:
В приложении Spring Boot мы довольно часто используем методы в разных @Service
классах, которые считывают пользователя из базы данных. Возьмем в качестве примера следующее:
@Transactional
public void someMethodInServiceA(long userId) {
User user = userRepository
.findById(userId)
.orElseThrow(() -> new EntityNotFoundException(String.format("User not found [id: %d]", userId)));
// do something with the user object...
}
@Transactional
public void anotherMethodInServiceB(long userId) {
User user = userRepository
.findById(userId)
.orElseThrow(() -> new EntityNotFoundException(String.format("User not found [id: %d]", userId)));
// do something else...
}
Поскольку код для извлечения User
объекта из базы данных почти идентичен, моей первой идеей было преобразовать его в общую службу, например UserService
, которая реализует этот метод, чтобы было только одно место, где пользователь фактически извлекается.
Есть ли какие-либо рекомендации с архитектурной точки зрения? Может быть, другие приложения, которые я еще не рассматривал?
Ответ №1:
создание пользовательского сервиса также является хорошим моментом в случае «сокрытия» репозитория для предотвращения нежелательных операций (например, методов только для чтения).
Если вам нужно несколько раз указать пользователя в запросе, вы также можете прочитать его один раз в контроллере или службе запуска и поместить его в локальный поток для дальнейшего использования.
Или даже получить текущего пользователя в перехватчике и добавить его в текущий запрос.