В чем разница между обычным объектом и Spring Bean?

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

Ответ

Обычный объект создается разработчиком напрямую с помощью оператора new. Его жизненный цикл, зависимости и конфигурация управляются вручную в коде.

Spring Bean — это объект, который:

  1. Создается, ассемблируется и управляется Spring IoC-контейнером.
  2. Является основным строительным блоком Spring-приложения.

Ключевые особенности Spring Bean, отличающие его от обычного объекта:

  • Управление контейнером: Контейнер инстанциирует bean, внедряет зависимости (DI), применяет AOP-прокси.
  • Конфигурация: Может быть объявлен через аннотации (@Component, @Service), XML или Java-конфигурацию.
  • Жизненный цикл: Поддерживает callback-методы (@PostConstruct, @PreDestroy).
  • Scope: Может иметь различную область видимости (singleton, prototype, request, session и др.) через @Scope.
  • Ленивая инициализация: Может быть создан только при первом обращении (@Lazy).

Пример:

// 1. Обычный объект
MyService myService = new MyService(); // Полный контроль у разработчика, нет DI.

// 2. Spring Bean
@Component // Аннотация, помечающая класс как кандидат для создания bean.
public class MyService {
    public void doWork() {
        System.out.println("Working...");
    }
}
// Где-то в другом компоненте:
@Autowired // Контейнер Spring внедрит (инжектирует) готовый экземпляр MyService.
private MyService myService;

Итог: Spring Bean — это объект, интегрированный в экосистему Spring, что обеспечивает инверсию управления, внедрение зависимостей и другие возможности фреймворка.