Javaアノテーション機構によるSpring自動アセンブリの原理を詳しく解説

黄舟
リリース: 2017-10-18 10:06:16
オリジナル
2299 人が閲覧しました

この記事では主に Java アノテーション機構の Spring 自動アセンブリ実装原理を詳しく紹介します。興味のある方は参考にしてください。

Java でのアノテーションの使用は主に SpringMVC (Spring Boot など) です。注釈は実際にはマークアップ言語と同等であり、実行時にこのマークが付いたメンバーを動的に操作できるようになります。注: Spring フレームワークはデフォルトでは自動アセンブリをサポートしていません。自動アセンブリを使用するには、Spring 構成ファイルの タグの autowire 属性を変更する必要があります。

autowiring 属性には 6 つのオプションの値があり、それぞれ異なる意味を表します:

byName ->Spring 環境からターゲット オブジェクトを取得する場合、ターゲット オブジェクト内の属性は名前に基づいて Spring 環境全体で検索されます< ; bean> タグの id 属性値。同じものがある場合は、このオブジェクトを取得して関連付けを実装します。 Spring 環境全体: すべての Spring 構成ファイルを検索することを意味し、ID を繰り返すことはできません。

byType -> Spring 環境からターゲット オブジェクトを取得する場合、ターゲット オブジェクト内の属性は、その型に応じて Spring 環境全体の タグのクラス属性値を検索します。同じものがある場合は、このオブジェクトを取得して関連付けを実装します。

欠点: 同じタイプの Bean オブジェクトが複数ある場合はエラーが発生します。属性が単一タイプのデータである場合は、関連付けられたオブジェクトが複数見つかった場合にエラーが発生します。コレクション (ジェネリック) 型の場合、複数の関連オブジェクトが見つかった場合でも例外は発生しません。

constructor ->コンストラクター メソッドを使用してオブジェクトの挿入を完了することは、実際にはコンストラクター メソッドのパラメーターの型に基づいたオブジェクトの検索であり、byType を使用するのと同等です。

autodetect ->自動選択: オブジェクトにパラメーターのないコンストラクターがない場合、コンストラクターの自動アセンブリ メソッドがコンストラクション インジェクション用に自動的に選択されます。オブジェクトにパラメーターなしのコンストラクターが含まれている場合、セッター注入には byType 自動アセンブリ メソッドが自動的に選択されます。 Tno -& gt; は自動アセンブリ機能をサポートしません

デフォルト -& GT; は、デフォルトで前のレベルのラベルの自動アセンブリの値を示します。設定ファイルが複数ある場合、各設定ファイルの自動組み立て方法は独立しています。

アノテーションの使用には、アノテーションの宣言、アノテーションを使用する要素、アノテーションが付けられた要素を操作するコードの3つの条件が必要です。最初のステップはアノテーションの宣言です。アノテーションは型です。カスタム アノテーションの記述コードは次のとおりです。


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" 默认值为"河北省"
}
ログイン後にコピー

カスタム アノテーション要素を使用します。コードは次のとおりです。 main 関数、特定のコードを実行します 次のように:



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);
  }
}
ログイン後にコピー

実行結果:


所有者: 河南省

所有者: 河北省
所有者: 河北省

Spring では 2 つの方法で動作します自動アセンブリを容易にするために、org.springframework.web.context.support.SpringBeanAutowiringSupport クラスを継承するか、@Component/@Controller およびその他のアノテーションを追加して、Spring 構成ファイルで context:component-scan 要素の構成を宣言します。

1) 自動配線を実現する継承メソッド Spring3.1.1のソースコードを見ると、SpringBeanAutowiringSupportクラスに以下のコードがあることがわかります:



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, "河南省");
 }
 }
}
ログイン後にコピー

分析: Javaはデフォルトの親クラスをパラメータなしで呼び出します。インスタンス化および構築中にコンストラクターが作成され、Spring はこれを使用して操作要素コードを実行します。


2) アノテーションの方法は上記の理論と似ていますが、アノテーションの自動アセンブリでは setter* の注入を完了する必要がないことに注意してください。 Spring3.1.1 のソース コードのアノテーション呼び出しシーケンスを確認して、次を取得します。 .web.context.support.SpringBeanAutowiringSupport #SpringBeanAutowiringSupport=>

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

org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#processInjection=>
org。 springframework.beans.factory .annotation.InjectionMetadata#Injection で、次のように inject メソッドのソース コードを表示します:


/**
 * 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);
}
ログイン後にコピー

分析: 上記のソース コードを通じて、Spring の自動アセンブリがリフレクション メカニズムを通じて実装されます。

以上がJavaアノテーション機構によるSpring自動アセンブリの原理を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート