Наибольшее преимущество использования фреймворка, такого как Spring, заключается в автоматической настройке. Только введя библиотеку или модуль в путь к классу, Spring может автоматически сканировать его и создавать необходимый объект и @Autowrired
оно.
@Компонент
– это аннотация , которая аннотирует класс . Он говорит Spring использовать этот класс для создания компонента, если от этого класса зависит что-то еще. Создание класса полностью контролируется Spring. И только один был создан для каждого класса.
@Component class UserService { public void updateUser(User user) { … } } @Controller class UserController { private final UserService userService; @Autowired public UserController(UserService userService) { this.userService = userService; } }
В этом примере Spring распознает внешний вид класса User Service
e, поскольку он был отмечен аннотацией @Component
. Поэтому, когда он пытается инициировать объект UserController
, он знает, что ему нужна Служба пользователя
для установки в конструктор UserController
. И создание Пользовательского сервиса
будет полностью контролироваться Spring. Это довольно декларативный способ определения зависимости.
С помощью @Компонента
наша жизнь так хороша. Так зачем нам вообще нужно что-то вроде аннотации @Bean
? Когда мы должны его использовать? Во-первых, @Bean
– это аннотация, используемая для аннотирования функции (не класса), которая вернет объект класса, который будет зарегистрирован как объект компонента Spring.
Вы можете использовать его в случае, если вы используете стороннюю библиотеку, когда у вас нет доступа к исходному коду библиотеки. Таким образом, вы не можете просто поместить @Component
аннотацию класса, который вы создаете для компонента. Вы можете объединить с @Configuration
аннотированный класс, содержащий метод, возвращающий компоненты, иначе Spring не будет перехватывать и регистрировать его как компонент для разрешения зависимостей. Давайте рассмотрим этот пример.
class UserService { private final PasswordEncoder encoder; @Autowired public UserService(PasswordEncoder encoder) { this.encoder = encoder; } public String createUser(UserCreateReq req) { UserEntity user = UserEntity.builder() .setPassword(this.encoder.encode(req.getPassword())) … .build(); repo.save(user); } } @Configuration class PasswordEncoderConfiguration { @Bean public PasswordEncoder bCryptPasswordEncoder() { return new BCryptPasswordEncoder(); } }
В этом примере я не смог изменить кодовую базу библиотеки bcrypt, чтобы создать объект encoder. Я должен использовать класс @Configuration
для создания компонента, который мне нужен, в методе внутри этого @Конфигурация
класс. Таким образом, мы могли бы создать столько бобовых объектов, сколько вы захотите. И вы должны явно настроить эти компоненты самостоятельно, когда произойдет конфликт. Один из способов разрешить этот конфликт – использовать аннотацию @Квалификатор
в конструкторе зависимого класса.
Это все. Счастливого кодирования.
Оригинал: “https://dev.to/htintrinh/bean-and-component-what-is-the-different-which-one-should-use-be-used-3foe”