Весна: @ Компонент против @Bean

Я понимаю, что аннотация @Component была введена весной 2.5, чтобы избавиться от определения xml bean с помощью сканирования classов.

@Bean был представлен весной 3.0 и может использоваться с @Configuration , чтобы полностью избавиться от xml-файла и использовать java-конфигурацию.

Возможно ли повторное использование annotations @Component вместо введения annotations @Bean ? Я понимаю, что конечной целью является создание бобов в обоих случаях.

@Component и @Bean делают две совершенно разные вещи, и их не следует путать.

@Component@Service и @Repository ) используются для автоматического обнаружения и автоматической настройки bean-компонентов, использующих сканирование classов. Существует неявное взаимно однозначное сопоставление между аннотированным classом и компонентом (т.е. одним компонентом для каждого classа). Контроль проводки довольно ограничен этим подходом, поскольку он носит чисто декларативный характер.

@Bean используется для явного объявления одного компонента, вместо того, чтобы позволить Spring делать это автоматически, как указано выше. Он отделяет декларацию компонента от определения classа и позволяет вам создавать и настраивать компоненты именно так, как вы выберете.

Чтобы ответить на ваш вопрос …

возможно ли повторное использование annotations @Component вместо введения annotations @Bean ?

Конечно, наверное; но они решили не делать этого, так как они совершенно разные. Весна уже достаточно запутанна, не заглушая воды дальше.

@Component Предпочтительно для сканирования компонентов и автоматической проводки.

Когда вы должны использовать @Bean ?

Иногда автоматическая настройка не является вариантом. Когда? Представим себе, что вы хотите подключать компоненты из сторонних библиотек (у вас нет исходного кода, поэтому вы не можете комментировать его classы с помощью @Component), поэтому автоматическая настройка невозможна.

Аннотации @Bean возвращают объект, который весна должна регистрироваться как компонент в контексте приложения. Тело метода несет логику, ответственную за создание экземпляра.

Давайте рассмотрим, что я хочу конкретной реализации в зависимости от некоторого динамического состояния. @Bean идеально подходит для этого случая.

 @Bean @Scope("prototype") public SomeService someService() { switch (state) { case 1: return new Impl1(); case 2: return new Impl2(); case 3: return new Impl3(); default: return new Impl(); } } 

Однако с @Component не существует способа сделать это.

Оба подхода направлены на регистрацию целевого типа в контейнере Spring.

Разница в том, что @Bean применим к методам , тогда как @Component применим к типам .

Поэтому, когда вы используете аннотацию @Bean вы управляете логикой создания экземпляра в теле метода (см. Пример выше ). С аннотацией @Component вы не можете.

Когда вы используете тег @Component , это то же самое, что и POJO ( @Bean объект Java) с помощью метода объявления ванили (аннотируется с помощью @Bean ). Например, следующий метод 1 и 2 даст тот же результат.

Способ 1

 @Component public class SomeClass { private int number; public SomeClass(Integer theNumber){ this.number = theNumber.intValue(); } public int getNumber(){ return this.number; } } 

с bean-компонентом для ‘theNumber’:

 @Bean Integer theNumber(){ return new Integer(3456); } 

Способ 2

 //Note: no @Component tag public class SomeClass { private int number; public SomeClass(Integer theNumber){ this.number = theNumber.intValue(); } public int getNumber(){ return this.number; } } 

с бобами для обоих:

 @Bean Integer theNumber(){ return new Integer(3456); } @Bean SomeClass someClass(Integer theNumber){ return new SomeClass(theNumber); } 

Метод 2 позволяет сохранять декларации бобов вместе, это немного более гибко и т. Д. Возможно, вы захотите добавить еще один не-ванильный компонент SomeClass, например:

 @Bean SomeClass strawberryClass(){ return new SomeClass(new Integer(1)); } 
  1. @Component автоматически обнаруживает и настраивает компоненты, используя сканирование classов, где @Bean явно объявляет один компонент, вместо того, чтобы позволить Spring делать это автоматически.
  2. @Component не отделяет объявление компонента от определения classа, где @Bean отделяет объявление компонента от определения classа.
  3. @Component представляет собой аннотацию уровня classа, где @Bean – это аннотация метода уровня, а имя метода – имя компонента.
  4. @ Компонент не обязательно должен использоваться с аннотацией @Configuration, где в annotations @Configuration должен использоваться аннотация @Bean .
  5. Мы не можем создать компонент classа с помощью @Component, если class находится вне весеннего контейнера, где мы можем создать компонент classа с помощью @Bean, даже если class присутствует вне весеннего контейнера .
  6. @Component имеет разные специализации, такие как @ Controller, @ Repository и @Service, где @Bean не имеет специализаций .
  • @component и его специализации (@Controller, @service, @repository) позволяют автоматически обнаруживать, используя сканирование classов. Если мы увидим, что class компонента, например @Controller, @service, @repository будет автоматически сканироваться с помощью Spring Framework, используя проверку компонентов.
  • @Bean, с другой стороны, может использоваться только для явного объявления одного компонента в classе конфигурации.
  • @Bean используется для явного объявления одного компонента, вместо того, чтобы позволить пружине делать это автоматически. Это делает septate объявление bean из определения classа.
  • Короче @Controller, @service, @repository предназначены для автоматического обнаружения и @Bean для создания отдельного компонента из classа
     - @Controller
     открытый class LoginController 
     {--code--}

     - @ Конфигурация
     открытый class AppConfig {
     @Bean
     public SessionFactory sessionFactory () 
     {--code--}

@Component Это общая аннотация и может быть применена к любому classу приложения, чтобы сделать его управляемым весной компонентом (просто, общий стереотип для любого управляемого пружинами компонента). когда путь к classам сканируется функцией компонента-сканирования (@ComponentScan) весны , он будет идентифицировать classы, аннотированные аннотацией @Component (в рамках данного пакета), и создать компоненты этих classов и зарегистрировать их в ApplicationContext. @Component представляет собой аннотацию на уровне classа, и ее цель – сделать class как управляемый весом компонент и автоматически обнаруживаемый bean-компонент для функции сканирования classов.

если вы хотите узнать больше о @Component и других аннотациях стереотипов, рекомендуется посмотреть на эту статью.

@Bean используется для явного объявления и регистрации компонента (как компонента конфигурации) в контейнере Spring IOC, который возвращается из метода. @Bean является аннотацией уровня метода и используется в classе, который аннотируется с @Configuration . Просто аннотация @Bean используется для регистрации компонента, возвращаемого методом в качестве компонента конфигурации Spring в контейнере IOC. @Bean – это только аннотация метода на уровне метода, и его нельзя использовать с объявлением classов и объектов.

Аннотации @Bean указывают, что метод создает компонент, который должен управляться контейнером Spring.

Чтобы объявить компонент, просто аннотируйте метод с помощью annotations @Bean . Когда JavaConfig встречает такой метод, он выполнит этот метод и зарегистрирует возвращаемое значение как компонент в ApplicationContext. По умолчанию имя компонента будет таким же, как имя метода. Ниже приведен простой пример объявления метода @Bean.

 @Configuration public class ApplicationConfig { @Bean public User adminUserProfile() { return new User("Rami","Nassar"); } } 

В classе ApplicationConfig вы можете увидеть, что мы сначала используем аннотацию @Configuration, чтобы сообщить Spring, что это файл конфигурации на основе Java. Впоследствии аннотация @Bean используется для объявления компонента Spring и требований DI. Аннотация @Bean эквивалентна tag, имя метода эквивалентно атрибуту id в пределах тег. Надеюсь, что после прочтения этой статьи у вас есть четкое представление о реальной цели и использовании аннотаций @Bean и @Component .

  • Для чего же Spring Framework?
  • Spring MVC: разница между тегами и ?
  • Как читать значения из файла свойств?
  • Получение контекста приложения Spring
  • Больше нет данных для чтения из ошибки сокета
  • Spring RedirectAttributes: addAttribute () vs addFlashAttribute ()
  • Сериализация перечислений с помощью Jackson
  • Потоковая обработка больших наборов результатов с помощью MySQL
  • Роль / цель ContextLoaderListener весной?
  • INFO: Нет типов Spring WebApplicationInitializer, обнаруженных на пути к classам
  • Spring MVC @PathVariable получает усечение
  • Interesting Posts
    Давайте будем гением компьютера.