Наибольшее преимущество использования фреймворка, такого как 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”