English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Spring框架的自动装配功能使您可以隐式注入对象依赖项。它在内部使用setter或构造函数注入。
自动装配不能用于注入基本值和字符串值。它仅适用于参考。
它需要 更少的代码,因为我们不需要编写代码来显式注入依赖项。
没有程序员的控制权。
它不能用于原始值和字符串值。
有很多自动装配模式:
模式 | 说明 |
no | 这是默认的自动装配模式。这意味着默认情况下没有自动装配。 |
byName | byName模式根据bean的名称注入对象依赖项。在这种情况下,属性名称和bean名称必须相同。它在内部调用setter方法。 |
byType | byType模式根据类型注入对象依赖项。因此属性名称和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
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>
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.
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>
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>