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

Autowiring automatico di Spring

La funzione di assemblaggio automatico del framework Spring ti permette di iniettare implicitamente le dipendenze degli oggetti. Utilizza internamente l'iniezione di setter o costruttori.

L'assemblaggio automatico non può essere utilizzato per iniettare valori di base e stringhe. È adatto solo per riferimenti.

Vantaggi del wiring automatico

Ha bisogno di Meno codicepoiché non dobbiamo scrivere codice per注入dipendenze esplicitamente.

Svantaggi del wiring automatico

Senza controllo del programmatore.

Non può essere utilizzato per valori originali e stringhe.

Schemi di wiring automatico

Ci sono molti schemi di wiring automatico:

SchemaDescrizione
noQuesto è lo schema di wiring automatico predefinito. Ciò significa che per default non c'è wiring automatico.
byNameIl modello byName inietta le dipendenze oggettuali in base al nome del bean. In questo caso, il nome dell'attributo e il nome del bean devono essere identici. Chiama internamente i metodi setter.
byTypeIl modello byType inietta le dipendenze oggettuali in base al tipo. Pertanto, il nome dell'attributo e il nome del bean possono essere diversi. Chiama internamente i metodi setter.
constructorIl modello di costruttore inietta le dipendenze chiamando il costruttore della classe. Chiamerà il costruttore con un gran numero di parametri.
autodetectNon raccomandato a partire da Spring 3.

Esempio di wiring automatico

Vediamo un esempio di codice semplice di wiring automatico in Spring. Devi usare l'attributo autowire dell'elemento bean per applicare lo schema di wiring automatico.

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

Vediamo un esempio completo di wiring automatico di Spring. Per creare questo esempio, abbiamo creato 4 file.

B.java A.java applicationContext.xml Test.java

B.java

Questa classe contiene solo il costruttore e i metodi.

package org.sssit;
public class B {
B(){System.out.println("b is created");}
void print(){System.out.println("hello b");}
}

A.java

Questa classe contiene un riferimento alla classe B e il costruttore e i metodi.

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

Questa classe recupera i Bean dal file applicationContext.xml e chiama il metodo di visualizzazione.

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

Output:

b è stato creato
a è stato creato
hello a
hello b

1) Modo di assemblaggio automatico byName

Nel modo di assemblaggio automatico byName, l'ID del bean e il nome di riferimento devono essere identici.

L'interno utilizza l'iniezione di setter.

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

Ma, se si cambia il nome del bean, non inietterà le dipendenze.

Vediamo il codice per cambiare il nome del bean da b a b1.

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

2) Modo di assemblaggio automatico byType

Nel modo di assemblaggio automatico byType, l'ID del bean e il nome di riferimento possono essere diversi. Ma può esserci solo un bean del tipo specificato.

L'interno utilizza l'iniezione di setter.

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

In questo caso, può funzionare correttamente perché hai creato un'istanza di tipo B. Non c'è problema, puoi utilizzare un nome di bean diverso dal nome di riferimento.

Ma, se hai più bean dello stesso tipo, non funzionerà e genererà un'eccezione.

Vediamo che nel codice ci sono molti bean di 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>

In questo caso, si genererà un'eccezione.

3) Modalità di iniezione del costruttore

In modalità di iniezione del costruttore automatico, il contenitore Spring inietta dipendenze tramite il costruttore parametrizzato di più alto livello.

Se una classe ha tre costruttori, zero parametri, uno e due parametri, viene eseguita l'iniezione chiamando il costruttore a due parametri.

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

4) Senza modalità di autowiring

In assenza di modalità di autowiring, il contenitore Spring non inietta dipendenze tramite autowiring.

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