Что такое Spring-бины?
Я все еще не могу найти четкое определение Spring-бинов, которое бы смог понять. Я часто вижу ссылки на них в документации и книгах по Grails, но считаю, что понимание того, что это такое, было бы полезным.
Итак:
- Что такое Spring-бины?
- Как их можно использовать?
- Связаны ли они как-то с внедрением зависимостей?
5 ответ(ов)
Что такое Bean в Spring?
Bean — это POJO (Plain Old Java Object), который управляется контейнером Spring.
Контейнеры Spring по умолчанию создают только один экземпляр бина. Этот бин кэшируется в памяти, так что все запросы к бину возвращают общий объект, ссылающийся на один и тот же экземпляр.
Аннотация @Bean
возвращает объект, который Spring регистрирует как бин в контексте приложения. Логика внутри метода отвечает за создание этого экземпляра.
Когда использовать аннотацию @Bean
?
@Bean
используется, когда автоматическая конфигурация невозможна. Например, когда нам нужно подключить компоненты из библиотеки третьей стороны, и у нас нет доступа к исходному коду, поэтому мы не можем аннотировать классы с @Component
.
Реальный пример — подключение к бакету Amazon S3. Поскольку исходный код недоступен, нам придется создать бин.
@Bean
public AmazonS3 awsS3Client() {
BasicAWSCredentials awsCreds = new BasicAWSCredentials(awsKeyId, accessKey);
return AmazonS3ClientBuilder.standard().withRegion(Regions.fromName(region))
.withCredentials(new AWSStaticCredentialsProvider(awsCreds)).build();
}
Источник кода выше → devglan.com
Поскольку я упомянул аннотацию @Component
, отметим, что @Component
указывает на то, что аннотированный класс является "компонентом". Такие классы считаются кандидатами для автоматического обнаружения при использовании конфигурации на основе аннотаций и сканирования классов.
Аннотация @Component
регистрирует класс как единственный бин.
Spring-бины — это классы. Вместо того чтобы создавать экземпляр класса (с помощью оператора new
), вы получаете экземпляр в виде bean
, приведённый к нужному типу вашего класса, из контекста приложения, где bean
— это то, что вы настроили в конфигурации контекста приложения. Таким образом, всё приложение поддерживает экземпляр с синглтон-областью на протяжении всего приложения. Все бины инициализируются в порядке их конфигурации сразу после создания контекста приложения. Даже если вы не используете никакие бины в вашем приложении, все экземпляры бинов уже созданы в момент создания контекста приложения.
В контексте приложения на Spring Boot bean - это просто объект Java, который создаётся фреймворком Spring при запуске приложения.
Назначение этого объекта может быть совершенно любым - это может быть конфигурация, сервис, фабрика соединений с базой данных и т.д. - фреймворку Spring это не важно.
Большинство beans зависят от других beans для своей работы. Например, менеджеру сущностей может понадобиться подключение к базе данных. Фреймворк Spring способен автоматически определить, как связать эти beans между собой. С точки зрения разработчика приложения вам нужно лишь объявить необходимые beans, и они "волшебным образом" появятся в вашем приложении, готовые к использованию.
Spring-бины — это просто экземпляры объектов, которые управляются контейнером IoC Spring. Контейнер IoC Spring отвечает за создание, поддержку и удаление бинов.
Мы можем добавить бин в Spring с помощью ручной настройки и автосвязывания. Ручная настройка (Wiring) подразумевает, что мы конфигурируем бин вручную в XML-файле. Автосвязывание (Auto Wiring) означает, что мы добавляем аннотации в Java-коде; затем Spring автоматически сканирует корневой контекст, где находится файл конфигурации Java, создаёт бин и добавляет его в контейнер Spring.
В Spring объекты, которые составляют основу вашего приложения и управляются контейнером инверсии управления (IoC), называются бинами. Бин — это просто объект, который создается, собирается и иначе управляется контейнером IoC Spring.
Почему поле с @Autowired в Spring оказывается null?
Разница между @Inject и @Autowired в Spring Framework: когда и что использовать?
Где находится аннотация @Transactional?
Как зарегистрировать SQL-запросы в Spring Boot?
Создание репозитория Spring без сущности