Maison  >  Article  >  Java  >  Explication détaillée du principe de l'assemblage automatique Spring implémenté par le mécanisme d'annotation Java

Explication détaillée du principe de l'assemblage automatique Spring implémenté par le mécanisme d'annotation Java

黄舟
黄舟original
2017-10-18 10:06:162249parcourir

Cet article présente principalement en détail le principe de mise en œuvre de l'assemblage automatique Spring du mécanisme d'annotation Java. Il a une certaine valeur de référence. Les amis intéressés peuvent se référer à

L'utilisation principale des annotations en Java Dans SpringMVC (Spring Boot, etc.), les annotations sont en fait équivalentes à un langage de balisage, qui vous permet d'opérer dynamiquement sur les membres qui ont le balisage au moment de l'exécution. Remarque : Le framework Spring ne prend pas en charge l'assemblage automatique par défaut. Pour utiliser l'assemblage automatique, vous devez modifier l'attribut autowire de la balise 60e23eb984d18edbb092da6b8f295aba

L'attribut de câblage automatique a 6 valeurs facultatives, chacune représentant des significations différentes :

byName -> trouvera la valeur de l'attribut id de la balise 60e23eb984d18edbb092da6b8f295aba dans l'ensemble de l'environnement Spring en fonction du nom. S'il y a les mêmes, récupérez cet objet et implémentez l'association. L'ensemble de l'environnement Spring : signifie rechercher dans tous les fichiers de configuration Spring, l'ID ne peut alors pas être répété.

byType -> Lors de l'obtention de l'objet cible à partir de l'environnement Spring, les attributs de l'objet cible rechercheront la valeur de l'attribut de classe de la balise 60e23eb984d18edbb092da6b8f295aba le genre. S'il y a les mêmes, récupérez cet objet et implémentez l'association.

Inconvénients : S'il existe plusieurs objets bean du même type, une erreur se produira ; si l'attribut est un seul type de données, une erreur se produira si plusieurs objets associés sont trouvés ; L'attribut est un type de tableau ou de collection (générique), alors aucune exception ne se produira si plusieurs objets associés sont trouvés.

constructeur ->L'utilisation de la méthode constructeur pour terminer l'injection d'objet est en fait une recherche d'objet basée sur le type de paramètre de la méthode constructeur, ce qui équivaut à l'utilisation de byType.

autodetect ->Sélection automatique : Si l'objet n'a pas de méthode de construction sans paramètre, la méthode d'assemblage automatique du constructeur est automatiquement sélectionnée pour l'injection de construction. Si l'objet contient un constructeur sans paramètre, la méthode d'assemblage automatique byType est automatiquement sélectionnée pour l'injection setter.​​​S'il existe plusieurs fichiers de configuration, la méthode d'assemblage automatique de chaque fichier de configuration est indépendante.

L'utilisation d'annotations nécessite trois conditions dont la déclaration de l'annotation, l'élément utilisant l'annotation et le code qui exploite l'élément annoté. La première étape est la déclaration d'annotation. L'annotation est un type. Le code d'écriture d'annotation personnalisé est le suivant :



Utilisez un élément d'annotation personnalisé, le code. est la suivante :


package annotation;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface AttachAnnotation {
  String paramValue() default "河北省"; // 参数名为"paramValue" 默认值为"河北省"
}


L'opération de test exécute la fonction principale. Le code spécifique est le suivant :


<.>

package annotation;

/**
 * @author 路人宅
 */
public class AttachEmlement {

  // 普通
  public void AttachDefault(String name){
    System.out.println("归属:" + name);
  }
  
  // 使用注解并传入参数
  @AttachAnnotation(paramValue="河北省")
  public void AttachAnnotation(String name){
    System.out.println("归属:" + name);
  }
  
  // 使用注解并使用默认参数
  @AttachAnnotation
  public void AttachAnnotationDefault(String name){
    System.out.println("归属:" + name);
  }
}

Résultat de l'exécution :

Propriétaire : Province du Henan
Propriétaire : Province du Hebei

Propriétaire : Province du Hebei
package annotation;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class AnnotionOperator {
 public static void main(String[] args) throws IllegalAccessException,
  IllegalArgumentException, InvocationTargetException,
  ClassNotFoundException {
 AttachEmlement element = new AttachEmlement(); // 初始化一个实例,用于方法调用
 Method[] methods = AttachEmlement.class.getDeclaredMethods(); // 获得所有方法

 for (Method method : methods) {
  AttachAnnotation annotationTmp = null;
  if ((annotationTmp = method.getAnnotation(AttachAnnotation.class)) != null)
  method.invoke(element, annotationTmp.paramValue());
  else
  method.invoke(element, "河南省");
 }
 }
}

Spring a deux manières de fonctionner afin de faciliter l'assemblage automatique : hériter de la classe org.springframework.web.context.support.SpringBeanAutowiringSupport ou ajouter @Component/@Controller et d'autres annotations et déclarer la configuration de l'élément context:component-scan dans la configuration Spring. déposer.

1) La méthode d'héritage réalise un câblage automatique. En regardant le code source de Spring3.1.1, vous trouverez le code suivant dans la classe SpringBeanAutowiringSupport :


Analyse : Java appellera le constructeur sans paramètre de la classe parent par défaut lors de l'instanciation et de la construction, et Spring l'utilise pour exécuter le code de l'élément d'opération.

2) La méthode d'annotation est similaire à la théorie ci-dessus. Il convient de noter que l'assemblage automatique d'annotation n'a pas besoin de terminer l'injection de setter*. Vérifiez la séquence d'appel d'annotation du code source Spring3.1.1 pour obtenir :

org.springframework.web .context.support.SpringBeanAutowiringSupport#SpringBeanAutowiringSupport=>
org.springframework.web.context.support.SpringBeanAutowiringSupport#processInjectionBasedOnCurrentContext=>

org.springframework.beans.factory.annotation .AutowiredAnnotationBeanPostProcessor#processInjection= >
/**
 * This constructor performs injection on this instance,
 * based on the current web application context.
 * Intended for use as a base class.
 * @see #processInjectionBasedOnCurrentContext
 */
public SpringBeanAutowiringSupport() {
 processInjectionBasedOnCurrentContext(this);
}
org.springframework.beans.factory.annotation.InjectionMetadata#Injection, affichez le code source de la méthode d'injection comme suit :





Analyse : Grâce au code source ci-dessus, Spring Autowiring est implémenté via le mécanisme de réflexion.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn