Что такое сервис в контексте Spring-приложения?

«Что такое сервис в контексте Spring-приложения?» — вопрос из категории Архитектура, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Сервис — это класс, реализующий бизнес-логику приложения. В Spring он помечается аннотацией @Service, что позволяет Spring автоматически обнаружить его как компонент и управлять его жизненным циклом.

Ключевые особенности:

  • Слой бизнес-логики: Сервисы инкапсулируют сложную логику, отделяя её от контроллеров (уровень представления) и репозиториев (уровень доступа к данным).
  • Внедрение зависимостей: Сервисы обычно получают зависимости (например, репозитории) через конструктор с @Autowired.
  • Транзакционность: Методы сервисов часто помечаются @Transactional для управления транзакциями.

Пример сервиса в Spring:

@Service
public class UserService {
    private final UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Transactional
    public User getUserById(Long id) {
        return userRepository.findById(id)
                .orElseThrow(() -> new UserNotFoundException("User not found with id: " + id));
    }
}

Почему это важно: Такой подход обеспечивает разделение ответственности (принцип Single Responsibility), упрощает модульное тестирование (сервис можно легко замокать) и повышает переиспользуемость кода.