Что такое Spring Bean?

Ответ

Spring Bean — это объект, жизненным циклом которого управляет контейнер Spring IoC (Inversion of Control). Бин создается, настраивается и ассемблируется на основе метаданных конфигурации (XML, аннотации, Java-код).

Ключевые характеристики:

  • Управление контейнером: Spring создает бины, внедряет зависимости (DI) и управляет их жизненным циклом.
  • Scope (область видимости): Определяет время жизни и количество экземпляров бина.
    • singleton (по умолчанию) — один экземпляр на контейнер.
    • prototype — новый экземпляр при каждом запросе.
    • request, session, application (для веб-приложений).
  • Конфигурация: Может быть объявлен несколькими способами.

Примеры объявления бина:

1. Через аннотацию @Component (и ее специализации @Service, @Repository):

@Service // Spring обнаружит и создаст бин этого класса
public class UserService {
    // логика сервиса
}

2. Через Java-конфигурацию (@Configuration + @Bean):

@Configuration
public class AppConfig {
    @Bean // Метод возвращает объект, который становится бином
    public DataSource dataSource() {
        return new DriverManagerDataSource(
            "jdbc:h2:mem:testdb", "sa", "");
    }
}

Ответ 18+ 🔞

А, слушай, смотри, вот эта вся ваша Spring-хуянг — она же, блядь, на простых понятиях держится! Вот, например, Spring Bean. Это не какая-то там мартышлюшка заморская, а самый обычный объект, который, как дурачка, контейнер Spring IoC за ручку водит. Он его, сука, создаёт, настраивает, зависимости ему впендюривает — полный пансион, блядь! А как он это делает? Да по метаданным, которые ты ему, как распиздяй, в XML, аннотациях или Java-коде оставил.

Что за зверь такой, этот бин?

  • Контейнер им рулит: Это главное, ёпта! Не ты его new вызываешь, а Spring, как хитрая жопа, сам его из ниоткуда материализует и все нужные штуки (зависимости, блядь) ему в ебальник засовывает. Жизненный цикл — тоже его забота.
  • Scope (область видимости): А это, сука, чтобы не было как у Герасима — либо всё, либо ничего. Тут можно выбрать, как он будет жить:
    • singleton (он же по умолчанию) — один такой царек на весь контейнер. Все на него ссылаются, как на икону.
    • prototype — а вот это уже пошла раздача слонов! Новый экземпляр каждый раз, когда кто-то этот бин просит. Ёперный театр, но иногда надо.
    • request, session, application — это уже для веб-разработчиков, у которых свои тараканы.
  • Как его объявить? Да как угодно, лишь бы контейнер понял, что ты от него хочешь.

Вот, смотри, как это на практике выглядит, чтобы не быть мудаком:

1. Через аннотацию @Component (или её сестрёнок @Service, @Repository):

@Service // Spring увидит эту надпись, охренеет от счастья и создаст бин этого класса. Всё, делов-то!
public class UserService {
    // а тут уже твоя бизнес-логика, которую ты, надеюсь, не просрал
}

2. Через Java-конфигурацию (@Configuration + @Bean):

@Configuration
public class AppConfig {
    @Bean // Смотри, сюда! Метод написал — и он возвращает объект, который Spring схватит и сделает своим бином. Красота, блядь!
    public DataSource dataSource() {
        return new DriverManagerDataSource(
            "jdbc:h2:mem:testdb", "sa", "");
    }
}

Вот и вся магия, ёбушки-воробушки. Не так страшен чёрт, как его малюют. Главное — не пытайся управлять им вручную, а то контейнер обидится и начнёт творить дичь.