Ответ
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 — это уже, блядь, как поехать на Запорожце на свидание, можно, но стыдно.
Вот так вот, коротко и без воды, а то развезти эту тему можно на овердохуища текста. Главное — понял принцип, а там уже разберёшься, куда и как пихать.