English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Функция автоматической装配ации фреймворка Spring позволяет вам隐но вводить зависимости объектов. Внутри используется инъекция через setter или конструктор.
Автоматическая装配ация не может использоваться для ввода базовых значений и строк. Она предназначена только для ссылок.
Он требует Меньше кодапоскольку нам не нужно писать код для явного внедрения зависимостей.
Нет контроля программиста.
Он не может использоваться для nguyên trị và giá trị chuỗi.
Есть много режимов автоматического подключения:
Режим | Объяснение |
no | Это default режим автоматического подключения. Это означает, что по умолчанию автоматическое подключение не используется. |
byName | Режим byName внедряет объектные зависимости по имени bean. В этом случае имена свойств и bean должны быть одинаковыми. Он внутренне вызывает метод setter. |
byType | Режим byType внедряет объектные зависимости по типу. Таким образом, имена свойств и bean могут быть различны. Он внутренне вызывает метод setter. |
constructor | Режим constructor внедряет зависимости, вызывая конструктор класса. Он вызывает конструктор с множеством параметров. |
autodetect | Не рекомендуется использовать с Spring 3. |
Давайте рассмотрим простую кодовую пример автоматического подключения в Spring. Вам нужно использовать атрибут autowire элемента bean для применения режима автоматического подключения.
<bean id="a" class="org.sssit.A" autowire="byName"></bean>
Давайте рассмотрим полный пример автоматического подключения Spring. Для создания этого примера мы создали 4 файла.
B.java A.java applicationContext.xml Test.java
B.java
Этот класс содержит только конструкторы и методы.
package org.sssit; public class B { B(){System.out.println("b is created");} void print(){System.out.println("hello b");} }
A.java
Этот класс содержит ссылку на класс B и конструкторы и методы.
package org.sssit; public class A { B b; A(){System.out.println("a is created");} public B getB() { return b; } public void setB(B b) { this.b = b; } void print(){System.out.println("hello a");} void display(){ print(); b.print(); } }
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"> <bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean> </beans>
Test.java
Этот класс получает bean из файла applicationContext.xml и вызывает метод отображения.
package org.sssit; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); A a = context.getBean("a", A.class); a.display(); } }
Вывод:
b создан a создан hello a hello b
В режиме автоматической装配 byName ID bean и имя ссылки должны быть одинаковыми.
Внутри используется инъекция через setter.
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean>
Но если изменить имя bean, он не будет инъектировать зависимости.
Давайте посмотрим на код, который изменяет имя bean с b на b1.
<bean id="b1" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean>
В режиме автоматической装配 byType ID beans и имя ссылки могут отличаться, но может быть только один bean одного типа.
Внутри используется инъекция через setter.
<bean id="b1" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byType"></bean>
В этом случае это работает normalmente, потому что вы создали экземпляр типа B. Ничего страшного, вы можете использовать имя bean, отличное от имени ссылки.
Но если у вас несколько bean одного типа, это не сработает и вызовет исключение.
Давайте посмотрим, сколько у нас beans типа B в коде.
<bean id="b1" class="org.sssit.B"></bean> <bean id="b2" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean>
В этом случае будет вызван исключение.
В режиме автоматической装配 конструктора контейнер Spring инъектирует зависимости через конструктор с наибольшим количеством параметров.
Если у класса три конструктора: без параметров, один параметр и два параметра, то инъекция выполняется через конструктор с двумя параметрами.
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="constructor"></bean>
Без режима автоматической装配 контейнер Spring не будет автоматически инъектировать зависимости.
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="no"></bean>