注意:これがため春IOCコンテナを理解するために学ぶの簡単な例です!!!!
図1に示すように、IOCコンテナ実装プロセス。
- XML設定ファイルをロードし、ラベルファイルをトラバース
- 単一のプロファイルIDとBeanクラスのプロパティを取得し、クラスファイルに従って対応するクラスをロードして、Beanのインスタンスを作成します
- 豆で満たされたプロパティ]タブの[プロパティの値を、取得
- 私たちは、IOCのコンテナに登録良い豆を設定します
図2に示すように、コードは示しています。
パッケージcom.baozi.Test; インポートのorg.w3c.dom.Document; インポートのorg.w3c.dom.Element; 輸入org.w3c.dom.Nodeの。 輸入org.w3c.dom.NodeList; 輸入javax.xml.parsers.DocumentBuilder。 輸入javax.xml.parsers.DocumentBuilderFactory。 輸入java.io.FileInputStream; 輸入java.io.InputStreamを。 インポートをjava.lang.reflect.Field; 輸入java.util.HashMapを; 輸入java.util.Map; / ** * @authorの包子 * @Create 2019-07-19-8:54 * / publicクラスSimpleIOC { プライベート地図<文字列、オブジェクト> beanMap =新しいHashMapの<>(); 公共SimpleIOC(文字位置)が例外{スロー loadBeans(場所) } getBeanパブリック(文字列名)をオブジェクト{ オブジェクトは、Bean =(名前を)beanMap.get; IF(豆== NULL){ スロー新新はIllegalArgumentException(+名"NOがない豆と名前"); } Beanを返す; } プライベート無効loadBeans (文字列LOCATION){例外をスロー // XML構成ファイルをロード //それが解析DOMパーサになるようにXML文書が入力ストリームオブジェクトに変換する解析 、FileInputStreamを(LOCATION)のinputStream =新しい新しいInputStreamを / ** * javax.xml。パッケージのDocumentBuilderFactory DOMモードを作成するために使用するパーサオブジェクトパーサは、 *のDocumentBuilderFactoryは抽象ファクトリクラス、それが直接インスタンス化することはできませんが、このクラスは、メソッドのnewInstanceを提供します *このメソッドは、ローカルのプラットフォームに応じて、デフォルトのインストールを解析し、 、ファクトリオブジェクトとリターンの自動作成。 * / //コールDocumentBuilderFactory.newInstance()メソッドは、DOMパーサファクトリを作成取得します。 工場= DocumentBuilderFactory.newInstanceのDocumentBuilderFactory(); //ファクトリオブジェクトのメソッドnewDocumentBuilder DOMパーサオブジェクトを取得するために呼び出します。 DocBuilder = factory.newDocumentBuilderてDocumentBuilder(); //コール解析DOMパーサオブジェクト()メソッドは、文書全体の文書オブジェクトの代わりに得られたXML文書を解析するために、 // DOMプロパティを使用してXML文書全体のために操作することができます。 DOC = docBuilder.parse文献(のinputStream); // XMLドキュメントのルートノード得る 要素doc.getDocumentElementルート=(); //ノードのサブノードを得る のNodeList root.getChildNodesノード=(); //反復<豆>タグ 以下のために(INT i = 0; iは nodes.getLength()<; iは++)を{ ノードnode = nodes.item(I)。 IF(要素ノードのinstanceof){ 素子ELE =(要素)ノード。 文字列ID = ele.getAttribute( "ID")。 文字列クラス名= ele.getAttribute(「クラス」)。 //加载たbeanClass クラスたbeanClass = NULL; {試みる たbeanClass = Class.forNameの(クラス名)。 }キャッチ(ClassNotFoundExceptionが電子){ e.printStackTrace(); 返します。 } //创建豆 オブジェクトビーン= beanClass.newInstance()。 //遍历<プロパティ>标签 // getElementsByTagNameの()メソッドを使用して文書オブジェクトは、我々がNodeListオブジェクトを取得することができ、 // Nodeオブジェクトは、XML文書内のタグ要素を表し、NodeListオブジェクトと彼の名前を見て、イタリア語を知って、 //表しNodeオブジェクトのリストです: NodeListのpropertyNodes = ele.getElementsByTagName(「プロパティ」 ); J ++){;(; J <propertyNodes.getLength(INT J = 0)のための ノードpropertyNode propertyNodes.item =(J)、 IF(propertyNode要素のinstanceof){ 要素propertyElement =(要素)propertyNode; 文字列名= propertyElement。 getAttribute(「名前」); String値= propertyElement.getAttribute(「値」); //関連ソラマメアクセスアクセスするためにリフレクションを使用して スロー新しい新はIllegalArgumentException( "REF設定エラー")。 DeclaredField = bean.getClassフィールド、()getDeclaredField(名);. DeclaredField.setAccessible(真の); IF(!= NULL && value.length値を()> 0){ 属性値//は、関連付けられたフィールドの中に充填される declaredField.set (豆、値); }他{ //これは、(未処理の)循環参照問題Beanオブジェクト属性が 文字列propertyElement.getAttribute REF =( "REF"); == NULL || ref.length IF(REF( )== 0){ } //参照が移入するフィールド declaredField.set(豆、getBean(REF) )。 } //ビーンコンテナにBeanを登録 registerBean(ID、豆); } } } } } //ここでビーンオブジェクト模倣注入プロセス容器IOC プライベートボイドregisterBean(ID文字列、オブジェクト豆){ beanMap.put(ID 、豆); } }
3、テストケース:
豆の強さに対応するクラス:
パブリッククラスの車{ プライベート文字列名; プライベート文字列の長さ。 プライベート文字列の幅。 プライベート文字列の高さ。 プライベートホイールホイール。 // .......................... } publicクラスのホイール{ プライベート文字列のブランド。 プライベート文字列仕様。 // ............................ }
テストXML文書が使用さ:
<豆> <ビーンID = "ホイール"クラス= "com.baozi.Wheel"> <プロパティ名= "ブランド"値= "ミシュラン" /> <プロパティ名= "仕様"値= "60分の265 R18" / > </ビーン> <ビーンID = "車"クラス= "com.baozi.Car"> <プロパティ名= "名前"値= "メルセデスベンツG 500" /> <プロパティ名= "長さ"値= "4717ミリメートル"/> <プロパティ名="幅」値= "1855ミリメートル" /> <プロパティ名= "高"値= "1949ミリメートル" /> <プロパティ名= "ホイール" REF = "ホイール" /> </豆> </豆>
テストカテゴリ:
パブリッククラスSimpleIOCTest { @Test 公共ボイドgetBean()は、例外がスロー{ 。。文字列位置= SimpleIOC.class.getClassLoader()のgetResource( "バネのtest.xml")はgetFile(); SimpleIOC BF =新しいSimpleIOC(位置) ホイールホイール=(車輪)bf.getBean( "車輪")。 System.out.println(ホイール) 車の車=(車)bf.getBean( "車")。 System.out.println(車)。 } }