Ответ
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.