English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Автоматическая装配 Spring

Функция автоматической装配ации фреймворка 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

1) Режим автоматической装配 byName

В режиме автоматической装配 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>

2) Режим автоматической装配 byType

В режиме автоматической装配 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>

В этом случае будет вызван исключение.

3) Режим автоматической装配 конструктора

В режиме автоматической装配 конструктора контейнер Spring инъектирует зависимости через конструктор с наибольшим количеством параметров.

Если у класса три конструктора: без параметров, один параметр и два параметра, то инъекция выполняется через конструктор с двумя параметрами.

<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="constructor"></bean>

4) Без режима автоматической装配

Без режима автоматической装配 контейнер Spring не будет автоматически инъектировать зависимости.

<bean id="b" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="no"></bean>