[セットトップ]SpringのIOC自動アセンブリ解析


林炳文Evaankakaオリジナル作品です.転載は出典を明記してください.http://blog.csdn.net/evankaka
     set注入と構造注入は、構成時に面倒な場合があります.したがって,フレームワークは開発効率を向上させ,自動組立機能を提供し,構成を簡素化する.Springフレームワークのデフォルトでは自動アセンブリはサポートされていません.自動アセンブリを使用するにはspringプロファイルのラベルのautowireプロパティを変更する必要があります.自動アセンブリプロパティには、5つの値がオプションで、それぞれ異なる意味を表します.
無料ダウンロード
1、byName
 Spring環境からターゲットオブジェクトを取得すると、ターゲットオブジェクトのプロパティは、名前に基づいてSpring環境全体でラベルのidプロパティ値を検索します.同じものがある場合は、このオブジェクトを取得し、関連付けを実現します.
 Spring環境全体:すべてのspringプロファイルで検索され、idが重複することはありません.
 
2、byType
 Spring環境からターゲットオブジェクトを取得すると、ターゲットオブジェクトのプロパティは、タイプに応じてspring環境全体でラベルのclassプロパティ値を検索します.同じものがある場合は、このオブジェクトを取得し、関連付けを実現します.
        欠点:同じタイプのbeanオブジェクトが複数存在する場合、エラーが発生します.
プロパティが単一のタイプのデータである場合、複数の関連オブジェクトが検索されるとエラーが発生します.
アトリビュートが配列または集合(汎用)タイプの場合、複数の関連オブジェクトが検出されても例外は発生しません.
3、constructor(3.x以上は使用不可)
 コンストラクションメソッドを使用してオブジェクト注入を完了することも、コンストラクションメソッドのパラメータタイプに基づいてオブジェクト検索を行うことであり、byTypeを採用することに相当する.見つからなかったら例外を投げ出す
4、autodetect
 自動選択:オブジェクトにパラメータのない構造方法がない場合は、constructorの自動アセンブリ方式を自動的に選択して構造注入を行います.オブジェクトにパラメータなしの構造方法が含まれている場合は、byTypeの自動アセンブリ方式を自動的に選択してsetter注入を行います.                      
5、no
デフォルトでは、自動的に組み立てるのではなく、「ref」attributeで手動で設定します.
        ラベルのautowireプロパティ.ラベルを自動的にアセンブリしてJavaBeanのプロパティを定義します.これにより、JavaBeanプロパティを構成するラベルコードを多く省くことができ、コードをきれいにし、美しくすることができます.しかし、自動アセンブリを使用すると、JavaBeanに必要なプロパティがプロファイルから読めないという負の影響もあります.自動アセンブリには、エラーマウントプロパティ、byTypeプロパティ、constructorプロパティが同じタイプのパラメータでは判断できないなど、不正確なアセンブリの問題がたくさんあります.もちろん、自動アセンブリと手動アセンブリを混合して使用しても、この問題は解決します.次の例では、自動アセンブリの使用方法を分析します.まず、学生クラスStudentを作成し、学生番号、名前、性別、年齢などの属性を定義し、
対応するset()とget()メソッド.プログラムコードは以下の通りです.
package com.autobean;

public class Student {
	private String ID;
	private String name;
	private int age;
	private String sex;

	public String getID() {
		return ID;
	}

	public void setID(String iD) {
		ID = iD;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

}
は同様に教師クラスTeacherを作成し、名前、性別、年齢などの属性を定義し、対応するset()とget()メソッドを追加します.プログラムコードは以下の通りです.
package com.autobean;

public class Teacher {
	private String name;
	private int age;
	private String sex;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String getSex() {
		return sex;
	}

	public void setSex(String sex) {
		this.sex = sex;
	}

}
カリキュラムクラスTeachFileを作成し、TeacherとStudioの2つのプロパティを定義し、print()メソッドを追加します.教師と学生の情報を出力するために使用されます.プログラムコードは以下の通りです. 
package com.autobean;

public class TeachFile {
	private Teacher teacher;
	private Student student;
	public TeachFile() {
	}
	public TeachFile(Teacher teacher, Student student) {
		this.teacher = teacher;
		this.student = student;
	}

	public Student getStudent() {
		return this.student;
	}

	public void setStudent(Student student1) {
		this.student = student1;
	}

	public Teacher getTeacher() {
		return teacher;
	}

	public void setTeacher(Teacher teacher) {
		this.teacher = teacher;
	}

	public void print() {
		System.out.println("------    ------");
		System.out.println("  :" + teacher.getName());
		System.out.println("  :" + teacher.getAge());
		System.out.println("  :" + teacher.getSex());
		System.out.println();
		System.out.println("------    ------");
		System.out.println("  :" + student.getID());
		System.out.println("  :" + student.getName());
		System.out.println("  :" + student.getAge());
		System.out.println("  :" + student.getSex());
	}

}
プロファイルアプリケーションContext.xmlで作成したクラスを定義し、値を割り当てます.このうちTeachFileクラスには自動アセンブリが採用されています.プログラムコードは以下の通りです.
<?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.2.xsd">

	<bean id="student" class="com.autobean.Student">
	    <property name="ID" value="80" /> 
	    <property name="name" value="  " /> 
	    <property name="age" value="23" /> 
	    <property name="sex" value=" " /> 
	</bean>
	<bean id="teacher" class="com.autobean.Teacher">
        <property name="name" value="   " /> 
        <property name="age" value="43" /> 
        <property name="sex" value=" " /> 
	</bean>
	<!--      ,  'ref’   bean -->
	<bean id="teachFile1" class="com.autobean.TeachFile" >
	 <property name="teacher" ref="teacher" />
	 <property name="student" ref="student" />
	</bean>
    <!--  byName    bean -->
	<bean id="teachFile2" autowire="byName"  class="com.autobean.TeachFile" />
	  <!--  byType    bean -->
    <bean id="teachFile3" autowire="byType" class="com.autobean.TeachFile" />
	  <!--  constructor    bean -->
	<bean id="teachFile4" autowire="constructor" class="com.autobean.TeachFile"/>
</beans>
このプロファイルでは、StudioクラスとTeacherクラスを定義し、名前、年齢、性別のプロパティに値を割り当てます.TeachFileクラスを定義する場合、パラメータは渡されず、autowireプロパティを使用してTeachFileクラスを自動的に構成するために必要なプロパティが使用されます.次に、アーカイブ情報を出力するプライマリクラスPrintInfoクラスを作成します.プログラムコードは以下の通りです.
package com.autobean;

import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.xml.XmlBeanFactory;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.Resource;

public class PrintInfo {

	public static void main(String[] args) {
		Resource res = new ClassPathResource("applicationContext.xml");
		BeanFactory bf = new XmlBeanFactory(res);
		TeachFile tf1 = (TeachFile) bf.getBean("teachFile1");
		TeachFile tf2 = (TeachFile) bf.getBean("teachFile2");
		TeachFile tf3 = (TeachFile) bf.getBean("teachFile3");
		TeachFile tf4 = (TeachFile) bf.getBean("teachFile4");

	
		System.out.println("     ,  'ref’   bean");
		tf1.print();
		System.out.println("  byName    bean");
		tf2.print();
		System.out.println("  byType    bean");
		tf3.print();
		System.out.println("  constructor    bean");
		tf4.print();
	
	}

}
出力結果:
4月02,2015 8:16:48午後org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions情報:Loading XML bean definitions from class path resource[アプリケーションコントロールxml]デフォルトでは、名前:何先生年齢:43性別:女-----学生情報-----学号:80名前:王さん年齢:23性別:男はbyNameによって自動的にbean-----教師情報-----名前:何先生年齢:43性別:女-----学生情報-----学号:80名前:王さん年齢:23性別:男はbyTypeによって自動的に组み立てbean------教师の情报------名前:何先生の年齢:43性别:女------学生の情报------学号:80名前:王さんの年齢:23性别:男はconstructorによってbean------教师の情报------名前:何先生の年齢:43性别:女------学生の情报------学号:80名前:王さんの年齢:23性别:男
上記の例のプロファイルappContext.xmlでは、TeachFileクラスは4種類のアセンブリを採用し、TeacherクラスとStudioクラスを対応するプロパティに注入します.構文のフォーマットは次のとおりです.
<bean autowire="byName" id="teachFile" class="TeachFile" />
autowireプロパティで「byName」というタイプを指定します.Autowireプロパティは5種類のアセンブリタイプをサポートしています.
各アセンブリタイプの使い方をそれぞれ紹介します.
(1)no:autowireが採用するデフォルト値で、自動アセンブリを採用する.refを使用して他のBeanを直接参照する必要があります.これにより、コードの可読性が向上し、エラーが発生しにくくなります.
(2)byName:自動アセンブリを属性名で区別します.コンテナ内でJavaBeanのプロパティ名と同じJavaBeanを探し、JavaBeanに自動的にアセンブリします.上記の例で説明すると、TeachFileクラスのインスタンスオブジェクトteachFileには、TeacherクラスとStudentクラスのインスタンスオブジェクトの2つのプロパティが含まれており、プロファイルでは2つのクラスのインスタンスが定義されています.teachFileインスタンスを定義するときに「byName」という自動アセンブリタイプを指定すると、コンテナはteachFileインスタンスに必要なプロパティ(すなわちteacherとstudentの2つのJavaBean)を自動的に検索し、teachFileインスタンスに注入します.このような自動アセンブリタイプでは、JavaBeanを誤ってアセンブリする可能性があります.プロファイルに自動アセンブリが必要なJavaBeanと同じ属性で異なるタイプのJavaBeanが定義されている場合、異なるタイプのJavaBeanが誤って注入されます.上記の例のプロファイルを変更して、studentとteacherの2つのJavaBeanのタイプを変更して、名前を変更すると、この問題が発生します.この場合、自動アセンブリではこの問題を解決できません.手動アセンブリをブレンドしてどのJavaBeanをアセンブリするかを指定するしかありません.
(3)byType:自動アセンブリを属性タイプで区別する.コンテナは、JavaBeanのプロパティタイプと同じJavaBeanの定義を自動的に検索し、自動アセンブリが必要なJavaBeanに注入します.上記のJavaBean自動アセンブリを構成するタイプをbyTypeに変更すると、同じ結果が得られます.この自動アセンブリタイプでは、自動アセンブリができない場合もあります.たとえば、コンフィギュレーション・ファイルにStudioクラスまたはTeacherクラスのインプリメンテーション・オブジェクトを再度追加すると、byType自動アセンブリ・タイプは、どのJavaBeanをアセンブリするかを自動的に認識できないためorg.springframework.beans.factory.UnsatisfiedDependencyException例外を放出します.これを解決するには
問題は、手動アセンブリをブレンドしてどのJavaBeanをアセンブリするかを指定することのみです.
(4)constructor:構築方法のパラメータタイプにより自動的に組み立てる.このタイプでは、コンテナはJavaBeanの構築方法と同じパラメータタイプのBeanを自動的に検索し、自動アセンブリが必要なJavaBeanに注入します.それは
byTypeタイプと同様に自動アセンブリが認識できない場合があります.
(5)autudetect:これは最後の自動アセンブリタイプで、まずconstructor方式で自動アセンブリし、byType方式を使用します.もちろんbyTypeやconstructorと同様の異常も存在する.建つ
自動アセンブリを使用する場合、問題が発生しやすいJavaBeanを手動アセンブリで依存属性を注入することを提案します.
無料ダウンロード
         林炳文Evaankakaオリジナル作品です.転載は出典を明記してください.http://blog.csdn.net/evankaka