Я понимаю, что @Component
аннотация была введена весной 2.5 для того, чтобы избавиться от определения bean-компонента xml с помощью сканирования classpath.
@Bean
был представлен весной 3.0 и может использоваться @Configuration
для полного избавления от XML-файла и использования вместо него конфигурации Java.
Было бы возможно повторно использовать @Component
аннотацию вместо введения @Bean
аннотации? Насколько я понимаю, конечной целью является создание бобов в обоих случаях.
java
spring
annotations
autowired
user1396576
источник
источник
@Component
,@Repository
и@Service
аннотации весной?Lite mode
. И это не рекомендуется. Смотрите здесь: docs.spring.io/spring/docs/current/spring-framework-reference/…@bean
возвращает настраиваемый экземпляр Spring Bean, в то время как@component
определяет класс, который может быть позднее создан движком Spring IoC при необходимости.Ответы:
@Component
и@Bean
делать две совершенно разные вещи, и не следует путать.@Component
(и@Service
и@Repository
) используются для автоматического обнаружения и автоматической настройки bean-компонентов с использованием сканирования пути к классам. Существует неявное взаимно-однозначное соответствие между аннотированным классом и компонентом (т. Е. Один компонент на класс). При таком подходе управление проводкой весьма ограничено, поскольку оно чисто декларативное.@Bean
используется для явного объявления одного компонента, а не для того, чтобы Spring делал это автоматически, как указано выше. Он отделяет объявление bean-компонента от определения класса и позволяет вам создавать и настраивать bean-компоненты именно так, как вы выбираете.Чтобы ответить на ваш вопрос ...
Конечно, наверное; но они решили не делать этого, так как они совершенно разные. Весна уже достаточно запутанна, не мутит воду дальше.
источник
@Component
тогда, когда требуется автопроводка? Кажется,@Bean
не может повлиять@Autowired
@Autowired
с ,@Bean
если вы аннотированный свой класс компонента с@Configuration
@Component Предпочтителен для сканирования компонентов и автоматического подключения.
Когда вы должны использовать @Bean ?
Иногда автоматическая настройка не вариант. Когда? Давайте представим, что вы хотите соединить компоненты из сторонних библиотек (у вас нет исходного кода, поэтому вы не можете аннотировать его классы с помощью @Component), поэтому автоматическая настройка невозможна.
@Bean аннотацию возвращает объект , который пружина должна регистрироваться в качестве боба в контексте приложения. Тело метода несет логику , ответственный за создание экземпляра.
источник
@Component
идет на сами классы, а@Bean
на методы класса (которые дают экземпляры объектов класса).Давайте рассмотрим, я хочу конкретную реализацию в зависимости от некоторого динамического состояния.
@Bean
идеально подходит для этого случая.Однако сделать это невозможно
@Component
.источник
@Configuration
источник
Оба подхода направлены на регистрацию целевого типа в контейнере Spring.
Разница в том, что
@Bean
это применимо к методам , тогда@Component
как применимо к типам .Поэтому, когда вы используете
@Bean
аннотацию, вы управляете логикой создания экземпляра в теле метода (см. Пример выше ). С@Component
аннотацией вы не можете.источник
Я вижу много ответов, и почти везде упомянутый @Component предназначен для автоматического подключения, когда компонент сканируется, а @Bean точно объявляет, что bean-компонент будет использоваться по-другому. Позвольте мне показать, как это отличается.
Сначала это аннотация уровня метода. Во-вторых, вы обычно используете для настройки bean-компонентов в java-коде (если вы не используете конфигурацию xml), а затем вызываете его из класса, используя метод getBean ApplicationContext. подобно
Это общий способ аннотировать бин, а не специализированный бин. Аннотация уровня класса и используется, чтобы избежать всей этой вещи конфигурации через конфигурацию java или xml.
Мы получаем что-то вроде этого.
Вот и все . Это было просто введено, чтобы избежать всех шагов конфигурации для создания экземпляра и использования этого компонента.
источник
@Bean
подход. Вы можете все еще использовать,@Autowire
чтобы получить боб, как вы это сделали бы в случае@Component
.@Bean
просто добавляет Боб в контейнер Spring, как и@Component
делает. Разница заключается в следующем. 1. Используя@Bean
, вы можете добавить сторонние классы в Spring Container. 2. Используя@Bean
, вы можете получить желаемую реализацию интерфейса во время выполнения (Используя шаблон фабричного проектирования)Вы можете использовать,
@Bean
чтобы сделать существующий сторонний класс доступным для контекста приложения Spring Framework.Используя
@Bean
аннотацию, вы можете обернуть сторонний класс (он может не иметь@Component
и не может использовать Spring) как бин Spring. И затем, как только он будет обернут, используя@Bean
его, он становится одноэлементным объектом и доступен в контексте приложения Spring Framework. Теперь вы можете легко делиться / повторно использовать этот bean-компонент в своем приложении, используя внедрение зависимостей и@Autowired
.Так что думайте о
@Bean
аннотации как обертке / адаптере для сторонних классов. Вы хотите сделать сторонние классы доступными для контекста приложения Spring Framework.Используя
@Bean
приведенный выше код, я явно объявляю один компонент, потому что внутри метода я явно создаю объект с помощьюnew
ключевого слова. Я также вручную вызываю методы установки данного класса. Так что я могу изменить значение поля префикса. Так что эта ручная работа называется явным творением. Если я использую@Component
для того же класса, боб, зарегистрированный в контейнере Spring, будет иметь значение по умолчанию для поля префикса.С другой стороны, когда мы аннотируем класс с помощью
@Component
, нам не нужно вручную использоватьnew
ключевое слово. Весной он обрабатывается автоматически.источник
Когда вы используете
@Component
тег, это то же самое, что иметь POJO (Plain Old Java Object) с методом объявления ванильного компонента (с аннотацией@Bean
). Например, следующий метод 1 и 2 даст тот же результат.Способ 1
с бобом для 'theNumber':
Способ 2
с бобами для обоих:
Метод 2 позволяет вам сохранять объявления bean-компонентов вместе, это немного более гибко и т. Д. Вы можете даже захотеть добавить другой не-vanilla bean-компонент SomeClass, как показано ниже:
источник
У вас есть два способа создания бобов. Одним из них является создание класса с аннотацией
@Component
. Другой - создать метод и аннотировать его@Bean
. Те классы, которые содержат метод с,@Bean
должны быть аннотированы с@Configuration
После того, как вы запустите свой весенний проект, класс с@ComponentScan
аннотацией будет сканировать каждый класс, содержащийся@Component
в нем, и восстановит экземпляр этого класса в контейнере Ioc. Еще одна вещь, которую нужно@ComponentScan
сделать, - запустить методы с@Bean
ним и восстановить объект возврата в контейнер Ioc в виде компонента. Поэтому, когда вам нужно решить, какой тип бобов вы хотите создать в зависимости от текущих состояний, вам нужно использовать@Bean
, Вы можете написать логику и вернуть нужный объект. Еще одна вещь, которую стоит упомянуть, - это имя метода с@Bean
именем по умолчанию для bean-компонента.источник
источник
@Bean был создан, чтобы не связывать Spring и ваши бизнес-правила во время компиляции. Это означает, что вы можете повторно использовать свои бизнес-правила в других средах, таких как PlayFramework или JEE.
Более того, у вас есть полный контроль над тем, как создавать bean-компоненты, когда этого недостаточно для стандартной реализации Spring.
Я написал пост об этом.
https://coderstower.com/2019/04/23/factory-methods-decoupling-ioc-container-abstraction/
источник
Разница между Бином и Компонентом:
источник
1. О @Component
@Component функционирует аналогично @Configuration.
Они оба указывают, что у аннотированного класса есть одна или несколько бинов, на которые необходимо зарегистрироваться
Spring-IOC-Container
.Класс, аннотируемый @Component, мы называем это
Component of Spring
. Это концепция, которая содержит несколько бобов.Component class
Spring должен быть автоматически отсканирован для регистрации этих компонентовcomponent class
.2. О @Bean
@Bean используется для аннотирования метода
component-class
(как упомянуто выше). Это указывает на то, что экземпляр, восстановленный аннотированным методом, должен быть зарегистрированSpring-IOC-Container
.3. Заключение
Разница между ними относительно очевидна, они используются в
different circumstances
. Общее использование:источник
Дополнительные очки сверху ответы
Допустим, у нас есть модуль, который используется несколькими приложениями и содержит несколько сервисов. Не все нужны для каждого приложения.
Если использовать @Component для этих классов обслуживания и компонент сканирования в приложении,
В этом случае вам либо пришлось настроить фильтрацию сканирования компонента, либо предоставить конфигурацию, которую могут запускать даже неиспользуемые компоненты. В противном случае контекст приложения не запустится.
В этом случае лучше работать с аннотацией @Bean и создавать только эти компоненты,
Поэтому, по сути, используйте @Bean для добавления сторонних классов в контекст. И @Component, если он только внутри вашего приложения.
источник