Эта статья взята измой блог
перед текстом
В предыдущей статье уже было представленоОсновные концепции бинов, поэтому сегодняшняя статья основана на трех методах сборки Bean в предыдущей статье для дальнейшего обсуждения, содержание будет перемежаться концепцией внедрения базовой зависимости
основное содержание
- автоматическая сборка
- Сборка с использованием XML
- Собрать с помощью Java
текст
1. Автоматическая сборка
- Именование бинов
В предыдущей статье при использовании аннотаций для определения bean-компонентов аннотации были добавлены в определение класса, а имя класса в нижнем регистре использовалось в качестве идентификатора bean-компонента, но мы можем сами назвать bean-компонент:
Установите значение компонента на имя бина.Если вы сделаете это, вы не найдете бина с именем «student» в тесте:
После изменения имени бина, полученного в тесте, на «myBean», тест можно пройти
- сканирование компонентов
В прошлый раз мы говорили о сканировании компонентов, есть два способа настроить сканирование компонентов:
- Конфигурация в XML-файле
- Добавьте аннотации к классам конфигурации Java
Восстановим состояние бина student, то есть добавим аннотацию к определению класса@Component:
Добавьте проверку компонента в файл конфигурации:
Это то, что я говорил в прошлый раз, поэтому больше говорить не буду, а затем давайте взглянем на компонентное сканирование класса конфигурации Java:
добавлена аннотация@ComponentС помощью одного параметра он указывает местоположение отсканированного пакета, что эквивалентно атрибуту базового пакета в файле конфигурации XML.
Если вы не заполните параметры, сканируйте пакет, в котором находится файл.Здесь мы сканируем пакет с именем «bean» и нажимаем кнопку слева от аннотации, чтобы перейти к классу Student (в пакете bean )
- Продвинутая автопроводка
Вот цитата из «Весны в действии»:
Проще говоря, автосвязывание — это способ позволить Spring автоматически удовлетворять зависимости bean-компонентов.В процессе удовлетворения зависимостей он будет искать другие bean-компоненты, соответствующие требованиям bean-компонента в контексте приложения Spring.
Здесь мы добавляем книгу интерфейса.Что касается того, почему мы используем интерфейсы вместо реализации классов, мы реализуем несколько реализаций этого интерфейса позже:
Затем создайте класс, реализующий интерфейс Book, и сделайте его bean-компонентом:
Поскольку это автоматическая сборка, необходимо использовать аннотации.@Autowired, то где можно использовать эту аннотацию?
- создавать экземпляр
- Конструктор (внедрение конструктора)
- Метод сеттера (инъекция сеттера)
Первый пункт упоминался ранее, добавляя эту аннотацию во время создания экземпляра для автоматической сборки.
Как использовать его в конструкторе?
Давайте изменим класс Student:
При конструировании Student я ввожу класс Book, потому что у нас уже есть реализация класса Book, поэтому здесь вводится bean-компонент englishBook
Следует отметить, что когда Spring создает bean-компонент студента, он будет передан в bean-компонент типа Book.
Есть две ситуации, которые вызывают исключение: отсутствие соответствующего bean-компонента или несколько соответствующих bean-компонентов.
Чтобы проверить первый случай, я поставил EnglishBook's@ComponentАннотация удалена, поэтому Bean типа Book отсутствует.
- Буду@Autowiredстоимость имуществаrequiredУстановите значение false, чтобы не пропустить бобы на графике:
После запуска теста я вижу два основных сообщения об ошибках:
Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name 'student' defined in file [C:\Users\94545\Desktop\Developer Folder\Java Test Folder\springtest\out\production\springtest\bean\Student.class]: Unsatisfied dependency expressed through constructor parameter 0; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'bean.Book' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'bean.Book' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
Во-первых, зависимость в конструкторе бина с именем «student» неверна, а во-вторых, что нет бина типа Book, из-за чего условия в конструкторе бина Student несовместимы.
Чтобы проверить второй случай, я возвращаю код и создаю другой bean-компонент типа Book: mathBook, в этом случае тест не будет пройден, потому что нет ни одного подходящего bean-компонента.
- Если есть несколько bean-компонентов, соответствующих требованиям, для устранения неоднозначности требуется следующая схема:
- Определите предпочтительный компонент:@Primaryаннотация
После тестирования было подтверждено, что аннотация работает:
- Используйте там, где требуется инъекция@Qualifierаннотация:
Эта аннотация недоступна для внедрения конструктора и будет объяснена позже при сборке метода Setter.
Как использовать его в методе Setter?
Нам нужно изменить класс Student и временно скрыть bean-компонент mathBook:
с участием@AutowiredАннотация, которая автоматически сопоставляет Beans типа Book при создании экземпляра:
Что касается метода Setter и конструктора для сборки Bean, в текущей ситуации обучения есть только одно отличие.разные детиКомпоненты, использующие конструктор для указания порядка сборки
Теперь давайте восстановим bean mathBook.Если возникают две вышеуказанные ситуации, которые могут вызывать исключения, есть два решения:
- @Primaryаннотация:
Как и выше, нечего сказать
- Используйте квалификаторы там, где требуется инъекция, т.е.@Qualifierаннотация:
Затем вы можете распечатать информацию об английской книге (без скриншотов)
Гибкость этой аннотации заключается в том, что она может установить квалификатор определения bean-компонента, то есть квалификатор не обязательно должен быть именем bean-компонента, поэтому выполните тест:
В настоящее время, если вы также используете englishBook в качестве квалификатора, вы также можете найти bean-компонент, но мы также можем использовать пользовательский квалификатор, изменить квалификатор в методе Setter и протестировать:
Докажите, что использование testQualifier в качестве квалификатора также дает результат
2. Использование сборки XML
Использование сборки XML также имеет метод внедрения конструктора или внедрения сеттера (Setter).Первые три используют внедрение конструктора.
1. Внедрение конструктора
Передать ссылку на бин
Отмените аннотации, добавленные в разделе автомонтирования, восстановите исходное состояние кода, а затем начните использовать сборку XML:
Пока не настраивайте bean-компонент mathBook и измените информацию о конфигурации контекста StudentTest:
Наконец, файл конфигурации для Bean:
Сначала создайте компонент EnglishBook, а затем создайте компонент student, здесь есть элемент
<constructor-arg ref=""/>
Поскольку у меня есть bean-компонент с именем englishBook в качестве параметра в конструкторе учащегося, Spring создаст bean-компонент с идентификатором englishBook и передаст его ссылку конструктору учащегося,refАтрибут указывает идентификатор bean-компонента, переданный по ссылке
передать строку
Что, если я передам не ссылку на bean-компонент, а строку в конструкторе student ?
Измените информацию о конфигурации в файле XML:
Атрибут value представляет значение литерала в конструкторе, которое может быть строкой, числом, логическим значением и т. д.
Затем проверьте это:
Докажите, что литерал был успешно введен
пропускной лист
У студента не может быть только одна книга, поэтому надо подумать, как пройти по списку?
Для начала модифицируем класс Student, входными параметрами будут не только строки, но и список книг:
Затем настройте bean-компонент в файле XML:
<bean id="englishBook" class="bean.EnglishBook"/>
<bean id="mathBook" class="bean.MathBook"/>
Наконец, настройте бин студента и настройте параметры конструктора:
<bean id="student" class="bean.Student">
<constructor-arg value="I have some books"/>
<constructor-arg>
<list>
<ref bean="englishBook"/>
<ref bean="mathBook"/>
</list>
</constructor-arg>
</bean>
Первый параметр — строка, а второй — список типа Book, в котором хранятся ссылки двух только что созданных бинов, а затем тесты:
Если список также содержит строки, а не ссылки, используйте атрибуты вместо атрибутов элемента.
2. Ввод заданного значения
Измените файл конфигурации класса Student и Bean:
Затем добавьте это предложение в файл конфигурации компонента:
<bean id="student" class="bean.Student">
<property name="book" ref="englishBook"/>
</bean>
Свойство предоставляет услуги для метода Setter, которые аналогичны услугам, предоставляемым вышеупомянутыми свойствами.В этом операторе я ввел ссылку на bean-компонент с идентификатором englishBook в книге, а затем проверил его, информация английской книги будет выведено:
Что касается внедрения литералов и списков, это фактически похоже на внедрение конструктора.Замена свойства на, но установка внедрения требует установки имени свойства, то есть внедрения ссылки на Bean (или литерала, или коллекции) в свойство b. не буду вдаваться в подробности
3. Сборка с Java
В дополнение к использованию XML код Java также можно использовать для сборки bean-компонентов и реализации внедрения зависимостей.
Поэтому нам нужно сначала изменить информацию о конфигурации контекста в тесте:
@ContextConfiguration(classes = StudentConfig.class)
Затем измените класс Student обратно на тип, введенный конструктором:
Сборка бина с использованием Java упоминалась в предыдущей статье, вот реализация внедрения зависимостей:
Определите два bean-компонента в классе конфигурации Java:
Используйте конструктор для внедрения bean-компонента EnglishBook в student, запустите тест, и вы получите вывод книги на английском языке:
Суммировать
На самом деле, в этой статье смешиваются сборка Bean-компонентов и внедрение зависимостей. Некоторых это может сбить с толку, но эти три метода на самом деле похожи с точки зрения мышления. Внимательно прочитав эти два введения о Bean-компонентах, вы сможете получить общее представление о IoC
DI (внедрение зависимостей) называется внедрением зависимостей. С точки зрения непрофессионала, это динамически удовлетворяет потребности объекта в других объектах во время выполнения. В приведенном выше примере учащемуся нужен Bean типа Book в качестве зависимости во время выполнения. Я буду внедрять Bean в него, называемый englishBook, который можно назвать внедрением зависимостей
IoC (инверсия управления) называется инверсией управления, во всех тестах, которые я делал выше, я не создавал вручную экземпляр объекта, скажем, вводя список, я даже не создавал экземпляр списка, поэтому почему все же пройдет тест? Поскольку Spring помогает мне создавать экземпляры каждого компонента при запуске программы.
IoC может быть реализован с помощью DI, то есть зависимости между различными компонентами в программе управляются Spring, который называетсяИнверсия контроля, который является ядром Spring
В будущем будут статьи, объясняющие эту концепцию.