English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
La fonction de composition automatique du cadre Spring vous permet d'injecter implicitement les dépendances d'objets. Il utilise l'injection setter ou constructor à l'intérieur.
La composition automatique ne peut pas être utilisée pour injecter des valeurs primitives et des valeurs de chaîne. Elle ne peut être utilisée que pour des références.
Il nécessite Moins de codeparce que nous n'avons pas besoin d'écrire de code pour injecter explicitement les dépendances.
Pas de contrôle du programmeur.
Il ne peut pas être utilisé pour des valeurs primitives et des valeurs de chaîne. Il ne peut être utilisé que pour des références.
Il y a beaucoup de schémas de composition automatique:
Mode | Description |
no | C'est le schéma de composition automatique par défaut. Cela signifie qu'il n'y a pas de composition automatique par défaut. |
byName | Le schéma byName injecte les dépendances d'objets en fonction du nom du bean. Dans ce cas, le nom de l'attribut et le nom du bean doivent être identiques. Il appelle les méthodes setter internes. |
byType | Le schéma byType injecte les dépendances d'objets en fonction du type. Par conséquent, le nom de l'attribut et le nom du bean peuvent être différents. Il appelle les méthodes setter internes. |
constructor | Le schéma constructor injecte les dépendances en appelant le constructeur de la classe. Il appelle le constructeur avec un grand nombre de paramètres. |
autodetect | à partir de Spring 3Il n'est pas recommandé d'utiliser à l'origine. |
Laissons voir un exemple simple de composition automatique dans Spring. Vous devez utiliser l'attribut autowire de l'élément bean pour appliquer le schéma de composition automatique.
<bean id="a" class="org.sssit.A" autowire="byName"></bean>
Laissons voir un exemple complet de wiring automatique de Spring. Pour créer cet exemple, nous avons créé4fichier.
B.java A.java applicationContext.xml Test.java
B.java
Cette classe ne contient que des constructeurs et des méthodes.
package org.sssit; public class B { B(){System.out.println("b is created");} void print(){System.out.println("hello b");} }
A.java
Cette classe contient une référence à la classe B ainsi que des constructeurs et des méthodes.
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
Ce classement tire des Bean à partir du fichier applicationContext.xml et appelle la méthode d'affichage.
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(); } }
Sortie:
b est créé a est créé hello a hello b
Dans le mode d'assemblage automatique par nom, l'ID de bean et le nom de référence doivent être identiques.
Utilisation interne de l'injection par setter.
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean>
Cependant, si vous changez le nom du bean, il ne recevra pas les dépendances d'injection.
Voyons comment changer le nom du bean de b en b1du code.
<bean id="b1" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byName"></bean>
Dans le mode d'assemblage automatique par type, l'ID de bean et le nom de référence peuvent être différents. Mais il ne peut y avoir qu'un bean d'un type donné.
Utilisation interne de l'injection via les setters.
<bean id="b1" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="byType"></bean>
Dans ce cas, cela fonctionne normalement car vous avez créé une instance de type B. Pas de problème, vous pouvez utiliser un nom de bean différent de celui de la référence.
Mais, si vous avez plusieurs beans du même type, cela ne fonctionnera pas et déclenchera une exception.
Voyons comment le code contient beaucoup de beans de type 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>
Dans ce cas, il déclenchera une exception.
Dans le mode d'auto-configuration via le constructeur, le conteneur Spring injecte les dépendances via le constructeur le plus paramétré.
Si une classe contient3Un constructeur, zéro paramètre, un paramètre et deux paramètres, puis l'injection est effectuée en appelant le constructeur à deux paramètres.
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="constructor"></bean>
Dans le cas où le mode d'auto-configuration n'est pas activé, le conteneur Spring ne va pas injecter les dépendances via l'auto-configuration.
<bean id="b" class="org.sssit.B"></bean> <bean id="a" class="org.sssit.A" autowire="no"></bean>