Какие бины будут использоваться для настройки приложения
Мы продолжаем наш цикл туториалов по Spring Framework, и сегодня речь пойдёт о сущности под названием Bean (бин).
Определение бина содержит метаданные конфигурации, которые необходимы управляющему контейнеру для получения следующей информации:
- Как создать бин;
- Информацию о жизненном цикле бина;
- Зависимости бина.
В Spring Framework существуют такие свойства, определяющие бины:
class
Этот атрибут является обязательным и указывает конкретный класс Java-приложения, который будет использоваться для создания бина.
name
scope
Это свойство определяет область видимости создаваемых объектов. (Прим. Отсутствие в русском языке достойного перевода этого свойства бинов могут вызвать затруднения, но более подробно оно будет рассмотрено далее).
constructor-arg
properties
Определяет свойства внедрения зависимости. Более подробно рассмотрим далее.
initialization method
Здесь определяется метод инициализации бина
destruction method
Метод уничтожения бина, который будет использоваться при уничтожении контейнера, содержащего бин.
autowiring mode
Определяет режим автоматического связывания при внедрении зависимости. Более подробно рассмотрим далее.
lazy-initialization mode
Режим ленивой инициализации даёт контейнеру IoC команду создавать экземпляр бина при первом запросе, а не при запуске приложения.
Контейнер IoC не зависит от формата, в котором передаются метаданные. Существует 3 основных метода передачи метаданных контейнеру Spring IoC:
- Конфигурационный XML-файл
- Конфигурация на основе аннотаций
- Конфигурация на основе Java
Ранее мы уже рассматривали как передаются метаданные на основе XML-файла. Теперь давайте рассмотрим пример XML-файла с различными свойствами
Конфигурирование бинов с помощью аннотаций мы рассмотрим позже в отдельной главе.
Сегодня я решил представить вам перевод цикла статей для подготовки к Spring Professional Certification.
Это перевод только первой статьи, если он зайдет аудитории, я продолжу выпуск переводов.
Зачем я это делаю, ведь уже есть куча профильных материалов?
- Spring 5 Design Patterns
- Spring in Action 4th edition
- Spring Security — Third Edition
- Core Spring 5 Certification in Detail by Ivan Krizsan
- Spring Documentation and Spring API javadocs
Внедрение зависимостей — это специальный паттерн, который уменьшает связь между Spring компонентами. Таким образом, при применении DI, ваш код становится чище, проще, его становится легче понять и тестировать.
Согласно паттерну DI, создание объектов для зависимостей переходит на фабрику или отдается третьей стороне. Это означает, что мы можем сосредоточиться на использовании этих объектов вместо их создания.
- Уменьшенная связь между частями приложения
- Улучшенное тестирование
- Улучшенная архитектура приложения
- Уменьшает шаблонный код
- Стандартизирует разработку приложения
- Улучшенное тестирование. В тестах бин может быть заменен специальным объектом(mock или stub), который реализует интерфейс бина.
- Позволяет использовать механизм динамических прокси из JDK(например, при создании репозитория через Spring Data)
- Позволяет скрывать реализацию
В Spring Framework интерфейс org.springframework.factory.BeanFactory предоставляет фабрику для бинов, которая в то же время является IoC контейнером приложения. Управление бинами основано на конфигурации(java или xml).
Интерфейс org.springframework.context.ApplicationContext — это обертка над bean factory, предоставляющая некоторые дополнительные возможности, например AOP, транзакции, безопасность, i18n, и т.п.
Что такое контейнер и какой у него жизненный цикл?Основа Spring Framework — контейнер, и наши объекты "живут" в этом контейнере.
Контейнер обычно создает множество объектов на основе их конфигураций и управляет их жизненным циклом от создания объекта до уничтожения.
Контейнер — это объект, реализующий интерфейс ApplicationContext.
- Контейнер создается при запуске приложения
- Контейнер считывает конфигурационные данные
- Из конфигурационных данных создается описание бинов
- BeanFactoryPostProcessors обрабатывают описание бина
- Контейнер создает бины используя их описание
- Бины инициализируются — значения свойств и зависимости внедряются в бин
- BeanPostProcessor запускают методы обратного вызова(callback methods)
- Приложение запущено и работает
- Инициализируется закрытие приложения
- Контейнер закрывается
- Вызываются callback methods
Spring обеспечивает несколько разновидностей контекста.
Есть несколько основных реализаций интерфейса ApplicationContext:
- FileSystemXmlApplicationContext
- ClassPathXmlApplicationContext
- AnnotationConfigApplicationContext
- XmlWebApplicationContext
- AnnotationConfigWebApplicationContext
Примеры создания контекста:
Можете ли вы описать жизненный цикл бина в контейнере? Как получить ApplicationContext в интеграционном тесте?Если вы используете JUnit 5, то вам нужно указать 2 аннотации:
- @ExtendWith(TestClass.class) — используется для указания тестового класса
- @ContextConfoguration(classes = JavaConfig.class) — загружает java/xml конфигурацию для создания контекста в тесте
Можно использовать аннотацию @SpringJUnitConfig , которая сочетает обе эти аннотации.
Для теста веб-слоя можно использовать аннотацию @SpringJUnitWebConfig .
Если это не веб-приложение, то есть 2 способа:
В Spring Boot приложении:
- Spring Boot самостоятельно зарегистрирует shutdown-hook за вас.
Чтобы создать класс с конфигурацией на основе Java-кода, нужно аннотировать его с помощью
@Configuration .
Этот класс будет содержать фабричные методы для создания бинов в контейнере.
Эти методы должны быть аннотированы аннотацией @Bean .
Этот класс поместит в контейнер экземпляр класса DataSource. Позднее его можно будет использовать при доступе к базе данных.
Component scanning(сканирование компонентов) — Spring автоматически обнаруживает бины, которые будут находиться в контейнере. Это бины с аннотациями-стереотипами.
Однако сканирование компонентов не включено по умолчанию.
Чтобы включить сканирование, аннотируйте @Configuration-класс аннотацией @ComponentScanning . Spring будет автоматически сканировать тот пакет, в котором находится этот класс и все его подпакеты.
Можно указать и другие пакеты для сканирования, и даже классы:
Autowiring(внедрение) — Spring автоматически внедрит зависимости во время сканирования или помещения бина в контейнер.
Для внедрения зависимостей используется аннотация @Autowire .
Стереотипы — это аннотации, обозначающие специальную функциональность.
Все стереотипы включают в себя аннотацию @Component .
Component | Корневая аннотация, которая помечает класс как кандидат для автовнедрения |
Controller | Указывает, что класс является контроллером для отправления данных на фронт. |
@RestController | Указывает, что класс является контроллером для REST. Содержит аннотации Controller и @ResponseBody |
Service | Указывает, что класс является сервисом для выполнения бизнес-логики |
Repository | Указывает, что класс является репозиторием для работы с бд |
@Configuration | Указывает, что класс содержит Java-конфигурацию(@Bean-методы) |
Область видимости — scope, скоуп. Существует 2 области видимости по умолчанию.
Singleton | Область видимости по умолчанию. В контейнере находится всего 1 экземпляр бина |
Prototype | В контейнере может находится любое количество экземпляров бина |
И 4 области видимости в веб-приложении.
Область видимости указывается с помощью аннотации @Scope на @Bean методах.
Как связаны различные скоупы и многопоточность?Prototype Scope не потокбезопасный, т.к. он не гарантирует что один и тот же экземпляр будет вызываться только в 1 потоке.
Singleton Scope же наоборот потокобезопасный.
Как создаются бины: сразу или лениво? Как изменить это поведение?Singleton-бины обычно создаются сразу при сканировании.
Prototype-бины обычно создаются только после запроса.
Чтобы указать способ инициализации, можно использовать аннотацию @Lazy .
Она ставится на @Bean-методы, на @Configuration-классы, или на @Component-классы.
В зависимости от параметра(true или false), который принимает аннотация, инициализация будет или ленивая, или произойдет сразу. По умолчанию(т.е. без указания параметра) используется true.
Singleton bean можно внедрять в любой другой бин.
В сам singleton можно внедрить только prototype или singleton .
Если внедрять prototype, то для каждого singleton будет создан уникальный prototype.
Prototype может быть зависимостью для любого бина.
Внедрять можно только singleton или prototype.
- BeanFactoryPostProcessor работает над описаниями бинов или конфигурационными метаданными перед тем, как бин будет создан.
- Spring поставляет несколько полезных реализаций BeanFactoryPostProcessor , например, читающий property-файлы и получающий из них свойства бинов.
- Вы можете написать собственную реализацию BFPP.
Для того чтобы использовать кастомный BFPP. Вы можете переопределить механизм получения данных из метафайлов.
- destroyMethod — указывает на метод обратного вызова. Метод находится в бине.
- initMethod — указывает на метод обратного вызова. Метод находится в бине.
- name — имя бина. По умолчанию именем бина является имя метода.
- value — алиас для name()
Spring использует несколько BeanPostProcessor’ов.
Например, CommonAnnotationPostProcessor или AutowiredAnnotationBeanPostProcessor .
BPP работает с экземплярами бинов, т.е. контейнер создает бин, а затем начинает работать BPP.
Есть 3 варианта для создания таких методов:
Как можно использовать аннотацию @Autowire и в чем отличие между способами?Ниже перечислены типы DI, которые могут быть использованы в вашем приложении:
DI через конструктор считается самым лучшим способом, т.к. для него не надо использовать рефлексию, а также он не имеет недостатков DI через сеттер.
DI через поле не рекомендуется использовать, т.к. для этого применяется рефлексия, снижающая производительность.
DI через конструктор может приводить к циклическим зависимостям. Чтобы этого избежать, можно использовать ленивую инициализацию бинов или DI через сеттер.
- Контейнер определяет тип объекта для внедрения
- Контейнер ищет бины в контексте(он же контейнер), которые соответствуют нужному типу
- Если есть несколько кандидатов, и один из них помечен как @Primary , то внедряется он
- Если используется аннотации @Autowire + Qualifier , то контейнер будет использовать информацию из @Qualifier , чтобы понять, какой компонент внедрять
- В противном случае контейнер попытается внедрить компонент, основываясь на его имени или ID
- Если ни один из способов не сработал, то будет выброшено исключение
Контейнер обрабатывает DI с помощью AutowiredAnnotationBeanPostProcessor. В связи с этим, аннотация не может быть использована ни в одном BeanFactoryPP или BeanPP.
Если внедряемый объект массив, коллекция, или map с дженериком, то Spring внедрит все бины подходящие по типу в этот массив(или другую структуру данных). В случае с map ключом будет имя бина.
Вы можете использовать разные типы внедрения:
Как использование @Qualifier дополняет @Autowired?Spring предоставляет аннотацию Qualifier, чтобы преодолеть проблему неоднозначности при DI.
Если в контейнере есть несколько бинов одного типа(SomeClass), то контейнер внедрит именно тот бин, над @Bean-методом которого стоит соответствующий квалификатор. Также можно не ставить квалификатор на метод, а использовать имя бина в качестве параметра квалификатора.
Имя бина можно можно указать через параметр аннотации Bean, а по умолчанию это имя фабричного метода.
Прокси это специальный объект, который имеет такие же публичные методы как и бин, но у которого есть дополнительная функциональность.
Два вида прокси:
- JDK-proxy — динамическое прокси. API встроены в JDK. Для него необходим интерфейс
- CGLib proxy — не встроен в JDK. Используется когда интерфейс объекта недоступен
- Позволяют добавлять доп. логику — управление транзакциями, безопасность, логирование
- Отделяет некоторый код(логирование и т.п.) от основной логики
Если в контейнере нет экземпляра бина, то вызывается @Bean-метод. Если экземпляр бина есть, то возвращается уже созданный бин.
Что такое профили? Какие у них причины использования?При использовании Java-конфигурации вы можете использовать аннотацию @Profile .
Она позволяет использовать разные настройки для Spring в зависимости от указанного профиля.
Ее можно ставить на @Configuration и Component классы, а также на Bean методы.
Для этого можно использовать аннотацию @Value .
Такие значения можно получать из property файлов, из бинов, и т.п.
В эту переменную будет внедрена строка, например из property или из view.
2. Во-вторых, необходимо интегрировать другие платформы, такие как структура разрешений Shiro и пейджинговый плагин MyBatis PageHelper. Основные классы сторонней среды должны быть переданы управляющему Spring.
@Configuration можно понимать как тег <beans> в xml при использовании spring
@Bean можно понимать как тег <bean> в xml при использовании Spring
Spring Boot не является улучшенной версией Spring, поэтому @Configuration и @Bean также можно использовать в обычных проектах Spring, не уникальных для Spring Boot, но при использовании Spring обратите внимание на конфигурацию пакета.
<context: component-scan base-package = "com.xxx.xxx", для того, чтобы пакеты были полезными, нужно отсканировать множество аннотаций для обычных проектов Spring, иногда они очень полезны для аннотаций, но они не работают. Обратите на это внимание.
Spring Boot не нуждается в этом. В основном вам необходимо убедиться, что вы запускаете основную запись Spring Boot, которая находится в верхнем пакете этих классов.
Так же, как это, DemoApplication является классом запуска. О местонахождении класса запуска есть специальный анализ в другом блоге.
Демо-классы для @Configuration и @Bean
Таким образом, в проекте
private DataSource dataSource;
В настоящее время этот источник данных является источником данных, который мы настроили в ExampleConfiguration
Начиная с Spring 3.0, @Configuration используется для определения классов конфигурации, которые могут заменить файлы конфигурации xml. Аннотированные классы содержат один или несколько методов, аннотированных @Bean. Эти методы будут проверяться классом AnnotationConfigApplicationContext или AnnotationConfigWebApplicationContext и использоваться. Для построения определений бина инициализируйте контейнер Spring.
Обратите внимание: Класс конфигурации, аннотированный @Configuration, имеет следующие требования:
- @ Конфигурация не может быть окончательной;
- @Configuration не может быть анонимным классом;
- Вложенная конфигурация должна быть статическим классом.
Сначала загрузите пружину с помощью @Configuration
1.1, @Configuration настроить пружину и запустить контейнер пружины
1.2, @Configuration запускает контейнер + @Bean для регистрации компонента
1.3, @Configuration запускает контейнер + @Component регистрирует компонент
1.4、Два метода для регистрации класса AppContext с использованием AnnotationConfigApplicationContext
1.5, настройте веб-приложение (настройте AnnotationConfigApplicationContext в web.xml)
Объединение нескольких классов конфигурации
2.1. Введите XML-файл конфигурации Spring в @configuration
2.2. Ввести другую конфигурацию аннотации в @configuration
2.3, вложенность @configuration (вложенная конфигурация должна быть статическим классом)
В-третьих, аннотация @EnableXXX
В-четвертых, конфигурация логической группы @Profile
5. Используйте внешние переменные
Во-первых, @Configuation загружает методы Spring
1.1 @ Конфигурация настройки пружины и запуска контейнера пружины
@Configuration отмечен в классе, что эквивалентно использованию этого класса в качестве XML-файла конфигурации весной. <beans> , Роль: настроить контейнер пружины (контекст приложения)
Основной метод для проверки:
Из результатов выполнения основного метода видно, что подпружиненный контейнер был запущен:
1.2, @Configuration запускает контейнер + @Bean для регистрации компонента и управляет жизненным циклом компонента в @Bean.
@Bean аннотации на методы (методы, которые возвращают экземпляр), эквивалентные тем, которые есть в XML-файле конфигурации Spring <bean> Роль: зарегистрировать объект EJB
Основной метод тестирования класса:
Примечание:
(1) аннотация @Bean для метода, который возвращает экземпляр, если @Bean не указывает имя компонента, значение по умолчанию совпадает с отмеченным именем метода;
(2) Область аннотации @Bean по умолчанию - это одноэлементная одноэлементная область, которая может быть установлена как область действия прототипа @Scope («prototype»);
(3) Поскольку @Bean используется для регистрации объектов бинов, вы можете использовать @Component, @Controller, @Service, @Ripository и другие аннотации для регистрации бинов. Конечно, вам необходимо настроить @ComponentScan Сканирование автоматически.
Жизненный цикл бина управления @Bean
Вы можете использовать конфигурацию на основе Java для управления жизненным циклом ваших компонентов. @Bean Поддерживает два атрибута, а именно initMethod и destroyMethod Эти атрибуты могут использоваться для определения методов жизненного цикла. Контейнер может вызывать методы жизненного цикла, когда компонент создается или собирается быть уничтоженным. Метод жизненного цикла также называется методом обратного вызова, потому что он будет вызываться контейнером. использование @Bean Аннотированные бобы также поддерживают стандарты, определенные JSR-250 @PostConstruct и @PreDestroy Комментарии. Если вы используете методы XML для определения bean-компонентов, вы должны использовать элементы bean-компонентов для определения методов обратного вызова жизненного цикла. В следующем коде показан метод, который обычно использует элементы компонента для определения обратных вызовов в конфигурации XML.
Доброго времени суток, Хабр.
Сегодня я решил представить вам перевод цикла статей для подготовки к Spring Professional Certification.
Это перевод только первой статьи, если он зайдет аудитории, я продолжу выпуск переводов.
- Внедрение зависимостей, контейнер, IoC, бины
- AOP (аспектно-ориентированное программирование)
- JDBC, транзакции, JPA, Spring Data
- Spring Boot
- Spring MVC
- Spring Security
- REST
- Тестирование
- Spring 5 Design Patterns
- Spring in Action 4th edition
- Spring Security — Third Edition
- Core Spring 5 Certification in Detail by Ivan Krizsan
- Spring Documentation and Spring API javadocs
Внедрение зависимостей — это специальный паттерн, который уменьшает связь между Spring компонентами (то есть между различными POJO). Таким образом, при применении DI, ваш код становится чище, проще, его становится легче понять и тестировать.
Согласно паттерну DI, создание объектов для зависимостей переходит на фабрику или отдается третьей стороне. Это означает, что мы можем сосредоточиться на использовании этих объектов вместо их создания.
- Уменьшенная связь между частями приложения
- Улучшенное тестирование
- Улучшенная архитектура приложения
- Уменьшает шаблонный код
- Стандартизирует разработку приложения
- Улучшенное тестирование. В тестах бин может быть заменен специальным объектом(mock или stub), который реализует интерфейс бина.
- Позволяет использовать механизм динамических прокси из JDK(например, при создании репозитория через Spring Data)
- Позволяет скрывать реализацию
В Spring Framework интерфейс org.springframework.factory.BeanFactory предоставляет фабрику для бинов, которая в то же время является IoC контейнером приложения. Управление бинами основано на конфигурации(java или xml).
Интерфейс org.springframework.context.ApplicationContext — это обертка над bean factory, предоставляющая некоторые дополнительные возможности, например AOP, транзакции, безопасность, i18n, и т.п.
Что такое контейнер и и какой у него жизненный цикл?Основа Spring Framework — контейнер, и наши объекты "живут" в этом контейнере.
Контейнер обычно создает множество объектов на основе их конфигураций и управляет их жизненным циклом от создания объекта до уничтожения.
Контейнер — это объект, реализующий интерфейс ApplicationContext.
- Контейнер создается при запуске приложения
- Контейнер считывает конфигурационные данные
- Из конфигурационных данных создается описание бинов
- BeanFactoryPostProcessors обрабатывают описание бина
- Контейнер создает бины используя их описание
- Бины инициализируются — значения свойств и зависимости внедряются в бин
- BeanPostProcessor запускают методы обратного вызова(callback methods)
- Приложение запущено и работает
- Инициализируется закрытие приложения
- Контейнер закрывается
- Вызываются callback methods
Spring обеспечивает несколько разновидностей контекста.
Есть несколько основных реализаций интерфейса ApplicationContext:
- FileSystemXmlApplicationContext
- ClassPathXmlApplicationContext
- AnnotationConfigApplicationContext
- XmlWebApplicationContext
- AnnotationConfigWebApplicationContext
Примеры создания контекста:
Можете ли вы описать жизненный цикл бина в контейнере? Как получить ApplicationContext в интеграционном тесте?Если вы используете JUnit 5, то вам нужно указать 2 аннотации:
- ```@ExtendWith(TestClass.class)``` — используется для указания тестового класса
- ```@ContextConfoguration(classes = JavaConfig.class)``` — загружает java/xml конфигурацию для создания контекста в тесте
Можно использовать аннотацию @SpringJUnitConfig , которая сочетает обе эти аннотации.
Для теста веб-слоя можно использовать аннотацию @SpringJUnitWebConfig .
Если это не веб-приложение, то есть 2 способа:
В Spring Boot приложении:
- Spring Boot самостоятельно зарегистрирует shutdown-hook за вас.
Чтобы создать класс с конфигурацией на основе Java-кода, нужно аннотировать его с помощью
@Configuration .
Этот класс будет содержать фабричные методы для создания бинов в контейнере.
Эти методы должны быть аннотированы аннотацией @Bean .
Этот класс поместит в контейнер экземпляр класса DataSource. Позднее его можно будет использовать при доступе к базе данных.
Component scanning(сканирование компонентов) — Spring автоматически обнаруживает бины, которые будут находиться в контейнере. Это бины с аннотациями-стереотипами.
Однако сканирование компонентов не включено по умолчанию.
Чтобы включить сканирование, аннотируйте @Configuration-класс аннотацией @ComponentScanning . Spring будет автоматически сканировать тот пакет, в котором находится этот класс и все его подпакеты.
Можно указать и другие пакеты для сканирования, и даже классы:
Autowiring(внедрение) — Spring автоматически внедрит зависимости во время сканирования или помещения бина в контейнер.
Для внедрения зависимостей используется аннотация @Autowire .
Стереотипы — это аннотации, обозначающие специальную функциональность.
Все стереотипы включают в себя аннотацию @Component .
Component | Корневая аннотация, которая помечает класс как кандидат для автовнедрения |
Controller | Указывает, что класс является контроллером для отправления данных на фронт. |
@RestController | Указывает, что класс является контроллером для REST. Содержит аннотации Controller и @ResponseBody |
Service | Указывает, что класс является сервисом для выполнения бизнес-логики |
Repository | Указывает, что класс является репозиторием для работы с бд |
@Configuration | Указывает, что класс содержит Java-конфигурацию(@Bean-методы) |
Область видимости — scope, скоуп. Существует 2 области видимости по умолчанию.
Singleton | Область видимости по умолчанию. В контейнере находится всего 1 экземпляр бина |
Prototype | В контейнере может находится любое количество экземпляров бина |
И 4 области видимости в веб-приложении.
Как создаются бины: сразу или лениво? Как изменить это поведение?Singleton-бины обычно создаются сразу при сканировании.
Prototype-бины обычно создаются только после запроса.
Чтобы указать способ инициализации, можно использовать аннотацию @Lazy .
Она ставится на @Bean-методы, на @Configuration-классы, или на @Component-классы.
В зависимости от параметра(true или false), который принимает аннотация, инициализация будет или ленивая, или произойдет сразу. По умолчанию(т.е. без указания параметра) используется true.
- BeanFactoryPostProcessor работает над описаниями бинов или конфигурационными метаданными перед тем, как бин будет создан.
- Spring поставляет несколько полезных реализаций BeanFactoryPostProcessor , например, читающий property-файлы и получающий из них свойства бинов.
- Вы можете написать собственную реализацию BFPP.
Для того чтобы использовать кастомный BFPP. Вы можете переопределить механизм получения данных из метафайлов.
- destroyMethod — указывает на метод обратного вызова. Метод находится в бине.
- initMethod — указывает на метод обратного вызова. Метод находится в бине.
- name — имя бина. По умолчанию именем бина является имя метода.
- value — алиас для name()
Spring использует несколько BeanPostProcessor’ов.
Например, CommonAnnotationPostProcessor или AutowiredAnnotationBeanPostProcessor .
BPP работает с экземплярами бинов, т.е. контейнер создает бин, а затем начинает работать BPP.
Есть 3 варианта для создания таких методов:
Как можно использовать аннотацию @Autowire и в чем отличие между способами?Ниже перечислены типы DI, которые могут быть использованы в вашем приложении:
DI через конструктор считается самым лучшим способом, т.к. для него не надо использовать рефлексию, а также он не имеет недостатков DI через сеттер.
DI через поле не рекомендуется использовать, т.к. для этого применяется рефлексия, снижающая производительность.
DI через конструктор может приводить к циклическим зависимостям. Чтобы этого избежать, можно использовать ленивую инициализацию бинов или DI через сеттер.
- Контейнер определяет тип объекта для внедрения
- Контейнер ищет бины в контексте(он же контейнер), которые соответствуют нужному типу
- Если есть несколько кандидатов, и один из них помечен как @Primary , то внедряется он
- Если используется аннотации @Autowire + Qualifier , то контейнер будет использовать информацию из @Qualifier , чтобы понять, какой компонент внедрять
- В противном случае контейнер попытается внедрить компонент, основываясь на его имени или ID
- Если ни один из способов не сработал, то будет выброшено исключение
Контейнер обрабатывает DI с помощью AutowiredAnnotationBeanPostProcessor. В связи с этим, аннотация не может быть использована ни в одном BeanFactoryPP или BeanPP.
Если внедряемый объект массив, коллекция, или map с дженериком, то Spring внедрит все бины подходящие по типу в этот массив(или другую структуру данных). В случае с map ключом будет имя бина.
Вы можете использовать разные типы внедрения:
Как использование @Qualifier дополняет @Autowired?Spring предоставляет аннотацию Qualifier, чтобы преодолеть проблему неоднозначности при DI.
Если в контейнере есть несколько бинов одного типа(SomeClass), то контейнер внедрит именно тот бин, над @Bean-методом которого стоит соответствующий квалификатор. Также можно не ставить квалификатор на метод, а использовать имя бина в качестве параметра квалификатора.
Имя бина можно можно указать через параметр аннотации Bean, а по умолчанию это имя фабричного метода.
Прокси это специальный объект, который имеет такие же публичные методы как и бин, но у которого есть дополнительная функциональность.
Два вида прокси:
- JDK-proxy — динамическое прокси. API встроены в JDK. Для него необходим интерфейс
- CGLib proxy — не встроен в JDK. Используется когда интерфейс объекта недоступен
- Позволяют добавлять доп. логику — управление транзакциями, безопасность, логирование
- Отделяет некоторый код(логирование и т.п.) от основной логики
Если в контейнере нет экземпляра бина, то вызывается @Bean-метод. Если экземпляр бина есть, то возвращается уже созданный бин.
Что такое профили? Какие у них причины использования?При использовании Java-конфигурации вы можете использовать аннотацию @Profile .
Она позволяет использовать разные настройки для Spring в зависимости от указанного профиля.
Ее можно ставить на @Configuration и Component классы, а также на Bean методы.
Для этого можно использовать аннотацию @Value .
Такие значения можно получать из property файлов, из бинов, и т.п.
В эту переменную будет внедрена строка, например из property или из view.
Читайте также: