Как Spring Framework взаимодействует с обычными Java-объектами (POJO)?

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

Ответ

Spring взаимодействует с POJO, превращая их в бины (beans) — управляемые объекты внутри IoC-контейнера. Контейнер отвечает за их создание, настройку зависимостей и управление жизненным циклом.

Основные способы взаимодействия:

  1. Dependency Injection (Внедрение зависимостей): Spring автоматически предоставляет зависимости бину.

    @Service // Помечает класс как бин, управляемый Spring
    public class OrderService {
        // Внедрение через конструктор (рекомендуемый способ)
        private final PaymentProcessor processor;
        public OrderService(PaymentProcessor processor) {
            this.processor = processor; // Spring находит и передает нужный бин
        }
    }
  2. Управление жизненным циклом через Scope: Spring контролирует, сколько экземпляров бина создается.

    • singleton (по умолчанию): Один экземпляр на контейнер.
    • prototype: Новый экземпляр при каждом запросе.
    • request, session (для веб): Экземпляр на HTTP-запрос или сессию.
  3. Аспектно-ориентированное программирование (AOP): Spring динамически создает прокси-объекты вокруг ваших бинов, чтобы добавлять сквозную логику (cross-cutting concerns).

    @Service
    public class BusinessService {
        @Transactional // Spring создает прокси, который управляет транзакцией
        public void performOperation() {
            // ... бизнес-логика
        }
    }

    Почему это работает? Контейнер Spring создает и хранит «мешок» бинов (ApplicationContext). Когда вам нужен объект, вы не используете new, а запрашиваете его у контейнера (через DI, @Autowired или context.getBean()), который возвращает полностью настроенный экземпляр со всеми внедренными зависимостями.