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

Autowiring de Spring

Spring框架的自动装配功能使您可以隐式注入对象依赖项。它在内部使用setter或构造函数注入。

自动装配不能用于注入基本值和字符串值。它仅适用于参考。

自动装配的优点

它需要 更少的代码,因为我们不需要编写代码来显式注入依赖项。

自动装配的缺点

没有程序员的控制权。

它不能用于原始值和字符串值。

自动装配模式

有很多自动装配模式:

模式说明
no这是默认的自动装配模式。这意味着默认情况下没有自动装配。
byNamebyName模式根据bean的名称注入对象依赖项。在这种情况下,属性名称和bean名称必须相同。它在内部调用setter方法。
byTypebyType模式根据类型注入对象依赖项。因此属性名称和bean名称可以不同。它在内部调用setter方法。
constructor构造函数模式通过调用类的构造函数来注入依赖项。它会调用具有大量参数的构造函数。
autodetect从Spring 3开始不推荐使用。

自动装配示例

让我们看一下在Spring使用自动装配的简单代码。您需要使用bean元素的autowire属性来应用自动装配模式。

<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

Esta clase obtiene Bean desde el archivo applicationContext.xml y llama al método de visualización.

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();
}
}

Salida:

b es creado
a es creado
hello a
hello b

1)modo de ensamblaje automático de byName

En el modo de ensamblaje automático de byName, el ID de bean y el nombre de referencia deben ser idénticos.

Se utiliza la inyección de setter internamente.

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

Sin embargo, si cambia el nombre del bean, no inyectará dependencias.

Veamos cómo cambiar el nombre del bean de b a b1del código.

<bean id="b1" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byName"></bean>

2)modo de ensamblaje automático de byType

En el modo de ensamblaje automático de byType, el ID de bean y el nombre de referencia pueden ser diferentes. Pero solo puede haber un bean de un tipo.

Se utiliza inyección interna a través de setter.

<bean id="b1" class="org.sssit.B"></bean>
<bean id="a" class="org.sssit.A" autowire="byType"></bean>

En este caso, puede funcionar correctamente porque ha creado una instancia de tipo B. No importa, puede usar un nombre de bean diferente al de la referencia.

Pero, si tiene varios beans del mismo tipo, no funcionará y lanzará una excepción.

Veamos que en el código hay muchos beans de tipo 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>

En este caso, generará una excepción.

3)Modo de inyección de constructor

En el modo de inyección de constructor, el contenedor de Spring inyectará dependencias a través del constructor más parametrizado.

Si en una clase hay3Un constructor, sin parámetros, uno con un parámetro y dos con parámetros, luego realiza la inyección llamando al constructor de dos parámetros.

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

4)Sin el modo de autowiring

Sin el modo de autowiring, el contenedor de Spring no inyectará dependencias de manera automática.

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