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

Montagem Automática do 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

Este classe obtém o Bean do arquivo applicationContext.xml e chama o método de exibição.

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

Saída:

b é criado
a é criado
hello a
hello b

1)modo de montagem automática por nome

No modo de montagem automática por nome, o ID do bean e o nome de referência devem ser iguais.

Uso interno do injetor setter.

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

Mas, se mudar o nome do bean, ele não injetará dependências.

Vamos ver como mudar o nome do bean de b para b1do código.

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

2)modo de montagem automática por tipo

No modo de montagem automática por tipo, o ID do bean e o nome de referência podem ser diferentes. Mas pode haver apenas um bean do tipo.

Uso interno da injeção de setter.

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

Neste caso, ele pode funcionar normalmente, porque você criou uma instância do tipo B. Não importa, você pode usar um nome de bean diferente do nome de referência.

Mas, se você tiver múltiplos beans do mesmo tipo, isso não funcionará e lançará uma exceção.

Vamos ver que no código há muitos beans do 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>

Neste caso, ele provocará uma exceção.

3)Modo de montagem automática do construtor

No modo de montagem automática do construtor, o container Spring injeta dependências através do construtor mais parametrizado.

Se uma classe tiver3um construtor, zero parâmetros, um parâmetro e dois parâmetros, e então executa a injeção chamando o construtor de dois parâmetros.

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

4)Modo de montagem automática

Sem o modo de montagem automática, o container Spring não injetará dependências através da montagem automática.

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