Чем @Component отличается от @Bean?
- Когда использовать @Bean, а когда @Component?
@Component — на своём классе, бин находится сканированием. @Bean — на методе в @Configuration-классе, который создаёт и настраивает объект; подходит для чужих классов и сложной конструкции.
- @Bean для библиотечных классов (ObjectMapper, RestClient, DataSource), которые нельзя пометить аннотацией
- @Bean — несколько бинов одного класса с разной настройкой
- @Service, @Repository, @Controller — специализации @Component
А ещё В @Configuration (proxyBeanMethods=true) вызов одного @Bean-метода из другого возвращает тот же singleton
Подробно
@Component ставится на класс. При сканировании пакетов (@ComponentScan, по умолчанию от пакета @SpringBootApplication) Spring находит класс и регистрирует бин. Конструктор выбирается контейнером, все параметры — бины. Специализации: @Service, @Repository (с трансляцией исключений), @Controller/@RestController.
@Bean ставится на метод в классе с @Configuration. Метод сам создаёт и настраивает объект; его параметры — бины. Нужен, когда:
- класс из библиотеки, и аннотацию на него не поставить;
- нужна нетривиальная настройка (билдеры, условия);
- нужно несколько бинов одного типа с разной конфигурацией (два DataSource).
Особенность @Configuration. По умолчанию класс проксируется CGLIB (proxyBeanMethods = true): вызов dataSource() из другого @Bean-метода вернёт существующий singleton, а не создаст новый. В «lite»-режиме (@Configuration(proxyBeanMethods = false) или @Bean в @Component) такой вызов — обычный вызов метода и создаст новый объект; Spring Boot использует lite-режим в автоконфигурациях ради скорости старта.
Что хотят услышать
- Где ставится каждая аннотация и как находится бин.
- Когда нужен @Bean.
- Специализации @Component.
- Проксирование @Configuration — плюс.
Частые ошибки
- Пытаться поставить @Component на библиотечный класс.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗@Component ставят на чужие классы, а @Bean — на собственные классы приложения
- ✓@Component — на своём классе, @Bean — метод в @Configuration для чужого класса
- ✗Это одно и то же
- ✗@Bean ставят только на интерфейс, а Spring сам генерирует его реализацию при старте
Что спросят дальше
- Что делает @Configuration?
- Как зарегистрировать сторонний класс как бин?
Разбор темы
- Стереотипы, @Bean и автосвязывание
Стереотипные аннотации и их семантика, @Bean против @Component, component-scan, @Autowired и разрешение неоднозначности.
Связанные вопросы
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.