ClassPathXMLApplicationContext書き換えの原理とコードについて

4827 ワード

ここ数日springフレームワークの少しのものを学んだばかりで、多くの大神の理解と見方を見て、springフレームワークの中にいくつかのモジュールがありますが、総じて2つの思想に分けられています.意識oop思想、つまりjava言語の核心思想は対象向けにプログラミングされていますが、springにはaopつまり面向けにプログラミングされています.これもスプリングフレームの比較のメリットでしょう.ここではこれについて議論しないで、まず入門のiocとC l a s PathXMLApplicationContextの簡単な書き換えについて話しましょうIOC(inversion of control)制御の反転
       :            ;                            。

       :spring         ;bean            bean。

       :               ,              。spring         new ,      ,     Java         、    ,spring      , xml  pring          ,          。

     spring IOC        ,  new      ,             ,          。

切断プログラミング:Springは切断プログラミングの豊富なサポートを提供し、アプリケーションのビジネスロジックとサービスを分離することができます.
コンテナ:Springはアプリケーション・オブジェクトの構成とライフサイクルを含み、管理します.この意味では、各beanがどのように作成されるかを構成できます.構成可能なプロトタイプ(prototype)、beanは個別のインスタンスを作成したり、必要に応じて新しいインスタンスを生成したりすることができます.それらがどのように関連しているかを設定できます.
フレームワーク:Springは簡単なコンポーネントを構成することができ、複雑なアプリケーションとして構成することができ、Springではアプリケーションオブジェクトが宣言的に結合され、典型的にはXMLファイルの中で、Springは多くの基礎機能(トランザクション管理、持続化フレームワーク統合など)を提供し、アプリケーションロジックの開発を私たちに残した.
書き換えのコアコードです.まずspring-contextのラックパッケージをインポートする必要があります.次はmaven依存です.
	
			org.springframework
			spring-beans
			4.3.8.RELEASE
		 -->

私がこのインポートしたのは4.3.8バージョンの現在springフレームワークが5.0以降のバージョンを更新している皆さんは、自分のニーズに合わせて自分のバージョンをインポートすることができます.以下はオブジェクト要素の取得と注入に関するコードです.主に必要なツールはjavaの反射で実現されています.
//         ApplicationContext      
public class ClassPathXMLApplicationContext implements ApplicationContext {
//           ,   
	private Map container = new HashMap<>();
	
	public Map getContainer() {
		return container;
	}
	public void setContainer(Map container) {
		this.container = container;
	}
	@Override
	public Object getBean(String id) {
		return container.get(id);
	}
	//1.  jdom  xml  
	//2.  xml  
	//3.        ,     ,        
	public ClassPathXMLApplicationContext(String path){
		SAXBuilder builder = new SAXBuilder();
		Document document = null;
		try {
		//  xml  
			document = builder.build(ClassPathXMLApplicationContext.class.getClassLoader().getResourceAsStream(path));
		} catch (JDOMException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		//                bean id class  
		Element root = document.getRootElement();
		List children = root.getChildren("bean");
		for(Element child : children){
		//  id class value
			String key = child.getAttributeValue("id");
			String classStr = child.getAttributeValue("class");
			
			try {
			//       session       container
				Object value = Class.forName(classStr).newInstance();
				container.put(key, value);
			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			} catch (ClassNotFoundException e) {
				e.printStackTrace();
			}
		}
		try{
		//                      
			for(Element child : children){
				Object obj = container.get(child.getAttributeValue("id"));
				List properties = child.getChildren("property");
				//           ref  ,                   
				//               
				for(Element property : properties){
					String ref = property.getAttributeValue("ref");
					String setStr = "";
					Object value = null;
					Method setter = null;
					if(ref != null){
						setStr = "set".concat(ref.substring(0,1).toUpperCase()).concat(ref.substring(1));
						value = container.get(ref);
						setter = obj.getClass().getMethod(setStr, value.getClass().getInterfaces()[0]);
					}else{
					//                       
						String name = property.getAttributeValue("name");
						setStr = "set".concat(name.substring(0,1).toUpperCase()).concat(name.substring(1));
						Field field = obj.getClass().getDeclaredField(name);
						
						String stringValue = property.getAttributeValue("value");
						setter = obj.getClass().getDeclaredMethod(setStr, field.getType());
						System.out.println("type : " + field.getType().getName());
						if(field.getType().getName().endsWith("Integer")) {
							Integer v = Integer.parseInt(stringValue);
							setter.invoke(obj, v);
							
						}else if(field.getGenericType().getTypeName().endsWith("String")) {
							setter.invoke(obj, stringValue);
						}
					}
				}
			}
		}catch(Exception e){
			e.printStackTrace();
		}
		
	}

}

ApplicationContextインタフェースの書き方です
public interface ApplicationContext {
	Object getBean(String id);
}


以上、この簡単なdemoがClassPathXMLApplicationContextの原理を理解できない人を助けることができることを望んでいます.