La funció de cablejat automàtic del marc de primavera us permet injectar la dependència de l'objecte de manera implícita. Utilitza internament la injecció de setter o constructor.
El cablejat automàtic no es pot utilitzar per injectar valors primitius i de cadena. Funciona només amb referència.
Avantatge del cablejat automàtic
Requereix el menys codi perquè no necessitem escriure el codi per injectar la dependència de manera explícita.
Desavantatge del cablejat automàtic
Sense control del programador.
No es pot utilitzar per a valors primitius i de cadena.
Modes de cablejat automàtic
Hi ha molts modes de cablejat automàtic:
quants zeros hi ha 1.000 milions
No. | Mode | Descripció |
---|---|---|
1) | no | És el mode de cablejat automàtic predeterminat. Significa que no hi ha cablejat automàtic per defecte. |
2) | per nom | El mode byName injecta la dependència de l'objecte segons el nom del bean. En aquest cas, el nom de la propietat i el nom del bean han de ser els mateixos. Crida internament al mètode setter. |
3) | perTipus | El mode byType injecta la dependència de l'objecte segons el tipus. Per tant, el nom de la propietat i el nom del bean poden ser diferents. Crida internament al mètode setter. |
4) | constructor | El mode constructor injecta la dependència cridant al constructor de la classe. Crida al constructor que té un gran nombre de paràmetres. |
5) | auto detectar | Està obsolet des de la primavera 3. |
Exemple de cablejat automàtic
Vegem el codi senzill per utilitzar el cablejat automàtic a la primavera. Heu d'utilitzar l'atribut autowire de l'element bean per aplicar els modes de cablejat automàtic.
Vegem l'exemple complet de cablejat automàtic a la primavera. Per crear aquest exemple, hem creat 4 fitxers.
- B.java
- A.java
- applicationContext.xml
- Test.java
Aquesta classe només conté un constructor i un mètode.
package org.sssit; public class B { B(){System.out.println('b is created');} void print(){System.out.println('hello b');} }A.java
Aquesta classe conté la referència de la classe B i el constructor i el mètode.
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
Test.java
Aquesta classe obté el bean del fitxer applicationContext.xml i crida al mètode de visualització.
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(); } }
Sortida:
b is created a is created hello a hello b
1) mode de cablejat automàtic per nom
En el cas del mode de cablejat automàtic byName, l'identificador del bean i el nom de referència han de ser els mateixos.
Utilitza internament la injecció de setter.
Però, si canvieu el nom de bean, no injectarà la dependència.
Vegem el codi on estem canviant el nom del bean de b a b1.
2) mode de cablejat automàtic byType
En el cas del mode de cablejat automàtic byType, l'identificador de bean i el nom de referència poden ser diferents. Però només hi ha d'haver una mongeta d'un tipus.
Utilitza internament la injecció de setter.
En aquest cas, funciona bé perquè heu creat una instància de tipus B. No importa que tingueu un nom de bean diferent del nom de referència.
Però, si teniu diversos beans d'un mateix tipus, no funcionarà i llançarà una excepció.
aes vs des
Vegem el codi on hi ha molts beans de tipus B.
En aquest cas, llançarà una excepció.
3) mode de cablejat automàtic del constructor
En el cas del mode de cablejat automàtic del constructor, el contenidor de molles injecta la dependència pel constructor amb el paràmetre més alt.
Si teniu 3 constructors en una classe, zero-arg, one-arg i two-arg, la injecció es realitzarà cridant al constructor de dos arguments.
4) no autowiring mode
En cas que no hi hagi cap mode de cablejat automàtic, el contenidor de molla no injecta la dependència mitjançant el cablejat automàtic.