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

Ответ

Обычный объект создается разработчиком напрямую с помощью оператора 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, что обеспечивает инверсию управления, внедрение зависимостей и другие возможности фреймворка.

Ответ 18+ 🔞

Да ты посмотри, что эти умники в документациях понаписали! Словно на латыни, ей-богу. Сейчас я тебе на человеческом языке объясню, в чём тут, блядь, собака зарыта.

Представь себе, что обычный объект — это как самодельный бутерброд. Захотел — пошёл на кухню, нарезал хлеб, колбасы навертел, майонезу херанул. Сам всё сделал, сам и съел. Полный контроль, но и возни, блядь, дохуя. Каждый раз одно и то же.

А Spring Bean — это тебе, сука, не бутерброд, а готовый бизнес-ланч в умном ресторане. Ты просто садишься за стол и говоришь: «Принесите мне, блядь, MyService». А тебе уже несут: и инстанс свежий, и все зависимости по соседству подсунуты (картошечка @Autowired, салатик @Resource), и даже соус AOP сверху полили. И контейнер-официант (этот твой IoC) за тобой приберётся, когда ты уйдёшь (@PreDestroy).

Вот на что эта мартышлюшка способна, в отличие от простого объекта:

  • Контейнер рулит: Не ты его создаёшь, а контейнер, как по маслу. Сам инжектит всё, что нужно, сам проксирует, если надо.
  • Объявляется, как король: Кинул аннотацию @Component или @Service — и всё, считай, прописан в системе. Не надо этих new по всему коду.
  • Жизнь интересная: Есть хуки — @PostConstruct (родился) и @PreDestroy (приказал долго жить). Можешь в эти моменты свою магию творить.
  • Бывает разным: Может быть один на всех (singleton), а может каждый раз новый, как перчатки (prototype). Через @Scope управляется.
  • Может и полениться: Зачем создаваться, если никто не спросил? @Lazy ему в помощь — будет валяться, пока не вызовут.

Смотри, как это выглядит в деле:

// 1. Старая, добрая, ручная работа. Сам всё делай, сам и отвечай.
MyService myService = new MyService(); // Всё, пиздец, никакой магии.

// 2. Spring-way, детка. Стильно, модно, молодёжно.
@Component // Эй, контейнер! Обрати на меня внимание, я — бин!
public class MyService {
    public void doWork() {
        System.out.println("Working...");
    }
}

// А в другом месте просто разеваешь рот:
@Autowired // Контейнер, дай сюда тот самый бин! Быстро, четко, без вопросов.
private MyService myService;

Короче, суть в чём: Spring Bean — это не просто объект, это, блядь, объект с пропиской в весёлом общежитии Spring. За него там и уборку сделают, и соседей подселят, и график жизни составят. Ты лишь говоришь, что тебе нужно, а остальное — не твоя, сука, головная боль. Вот и вся философия, ёпта.