Какие основные способы создать бин в Spring?

Ответ

Spring предоставляет несколько декларативных способов определения бинов (управляемых объектов) в контейнере IoC.

1. Аннотация @Component (и её стереотипы) Наиболее распространенный способ при использовании автоматического сканирования компонентов (@ComponentScan).

@Component // Общая аннотация
public class MyComponent { /* ... */ }

@Service // Специализация для слоя бизнес-логики
public class MyService { /* ... */ }

@Repository // Специализация для слоя доступа к данным (DAO)
public class MyRepository { /* ... */ }

@Controller // Специализация для веб-слоя (MVC)
public class MyController { /* ... */ }

2. Java-конфигурация с @Bean Используется в классах, помеченных @Configuration. Позволяет полностью контролировать создание бина.

@Configuration
public class AppConfig {
    @Bean // Метод возвращает объект, который становится бином
    public MyService myService() {
        return new MyServiceImpl();
    }

    @Bean(name = "dataSource") // Можно задать имя бина
    @Scope("prototype") // Можно изменить scope (не singleton)
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

3. XML-конфигурация (устаревший, но поддерживаемый способ)

<beans>
    <bean id="myBean" class="com.example.MyBean"/>
    <bean id="myService" class="com.example.MyService">
        <property name="dependency" ref="myBean"/>
    </bean>
</beans>

4. Программная регистрация через ApplicationContext

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(MyBean.class); // Регистрация класса
context.refresh(); // Обновление контекста
MyBean bean = context.getBean(MyBean.class);

Ключевые моменты:

  • По умолчанию все бины являются синглтонами (scope="singleton").
  • Для инъекции зависимостей между бинами используйте @Autowired (предпочтительно в конструкторе).
  • Способы можно комбинировать, но @Component и @Bean являются стандартами для современного Spring.

Ответ 18+ 🔞

А, слушай, смотри, блядь! Тут у нас Spring, как сука-мать, на разный лад умеет свои бины в контейнер пихать. Это ж как управляемые объекты, понимаешь? Ну, чтоб не самому их создавать, а он, падла, за тебя всё сделает. Во какие распиздяйства!

1. Аннотация @Component (и её стереотипы, блядь) Это, типа, самый модный способ, когда контекст сам по коду бегает и всё сканирует (@ComponentScan). Как собака сука, всё обнюхает и отметит.

@Component // Ну, общая такая, блядь, метка. "Здесь бин лежит!"
public class MyComponent { /* ... */ }

@Service // А это уже для наших, для бизнес-логиков, важных пацанов. Тоже бин, но с претензией.
public class MyService { /* ... */ }

@Repository // Это для тех, кто с базой данных ебётся. Тоже бин, но Spring ему ещё и исключения ловит, хитрая жопа!
public class MyRepository { /* ... */ }

@Controller // Ну, это для веба, для этих ваших МВЦ-шных дел. Тоже, блядь, бин!
public class MyController { /* ... */ }

Короче, наклеил такую бумажку на класс — и всё, ты в системе, чувак. Сидишь и ждёшь, когда тебя куда-нибудь воткнут.

2. Java-конфигурация с @Bean А это, блядь, для перфекционистов, которые хотят всё руками контролировать. Пишешь класс с @Configuration и там уже, как царь, объявляешь.

@Configuration
public class AppConfig {
    @Bean // Смотри, сюда! Метод написал — и всё, что он вернёт, станет священным бином. Магия, ёпта!
    public MyService myService() {
        return new MyServiceImpl();
    }

    @Bean(name = "dataSource") // А тут имя ему дал, чтоб не просто "myService", а с паспортом!
    @Scope("prototype") // И сказал: "Не будь синглтоном, блядь, плодись каждый раз новый!" Овердохуища возможностей!
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

Тут ты сам бог и царь, сам решаешь, какого хуя этот бин создавать.

3. XML-конфигурация (дедовский способ, но ещё дышит) Это, блядь, как старый дед, который всё в тетрадочке записывает. Ещё работает, но все уже смотрят как на реликт.

<beans>
    <bean id="myBean" class="com.example.MyBean"/>
    <bean id="myService" class="com.example.MyService">
        <property name="dependency" ref="myBean"/> <!-- Вот, смотри, ручками прописал, кто куда вставляется. Старая школа, блядь! -->
    </bean>
</beans>

Читать это — всё равно что клинопись разгадывать, но для легаси-проектов, бывает, пиздец как нужно.

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

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.register(MyBean.class); // Эй, контекст, запомни этот класс, он нам нужен!
context.refresh(); // А теперь, сука, соберись и всё создай! Без этого шага — нихуя не работает.
MyBean bean = context.getBean(MyBean.class); // Вот он, родимый, вытащили!

Прям как в цирке, только с бинами.

Ключевые моменты, чтоб не обосраться:

  • По умолчанию все бины — синглтоны, блядь. Один на весь мир. Scope="singleton". Не накрутил — будет один экземпляр на всех, как последняя палка колбасы в общаге.
  • Чтобы один бин в другой воткнуть, юзай @Autowired. Лучше всего — в конструктор пихай, так модно и правильно. Spring сам всё подтянет, хитрая жопа.
  • Все эти способы можно мешать, как хуй пойми что, но в моде сейчас @Component и @Bean. XML — это уже, блядь, как поехать на Запорожце на свидание, можно, но стыдно.

Вот так вот, коротко и без воды, а то развезти эту тему можно на овердохуища текста. Главное — понял принцип, а там уже разберёшься, куда и как пихать.