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

«Какие основные способы создать бин в Spring?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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.