Springはどのようにビーンを管理しますか?

4591 ワード

先生から容器とは何ですか?springではどのように表現されていますか?ずっと迷っていますが、この二日間Spring管理beanのDemoを見て、Springの中の容器について簡単に認識しました.
   容器は空間の概念であり、物体を入れる場所として一般的に理解されていることを知っています.Spring容器では、一般的にBenFactoryまたはAppliation Contectとして理解される.我々は、スプリングのIOC容器が対象を作成してくれることを知っています.対象はスプリング管理に任せてから、手動でnewオブジェクトに行く必要はありません.
   BeanFactoryとApplication Comptextの違いは何ですか?
   BenFactoryは工場の設計モードを採用して、bean配置文書を読み、beanのロードを管理し、実用化し、bean間の依存関係を維持し、beanの声明周期を担当しています.Application Contectは上記BeanFactoryが提供できる機能以外に、より完備したフレームワーク機能を提供しています.国際化支援、aop、事務など.一方、BenFactoryはプロファイル解析時にオブジェクトを初期化することはなく、オブジェクトgetBen()を使用することによってのみ、そのオブジェクトを初期化し、Application Conteetはプロファイル解析時に配置ファイル中のすべてのオブジェクトを初期化し、getBen()メソッドはオブジェクトを取得するプロセスのみである.
   ですから、私たちは普段使う時はなるべくApplication Contectを使います.
   Application ComptextはどのようにBeaビンを管理しますか?以下のこのデモは簡単にこの原理を真似しました.
   1.クラスPersonServiceBeanを作成し、xmlファイルで構成します.
    
	public class PersonServiceBean implements PersonService   {
		public void save(){
			System.out.println("  save()  ");
		}
	}
  2.類BenDefinitionを建立して、各beanの公共モデルチェンジクラスとして機能を提供します.
public class BeanDefinition {
	
	private String id;	
	private String className;
	
	public BeanDefinition(String id, String className) {
		this.id = id;
		this.className = className;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getClassName() {
		return className;
	}

	public void setClassName(String className) {
		this.className = className;
	}
}
   3.容器類tgbApple Contectを作成します.
    
	/**
	 *   spring  
	 * @author hegang
	 *
	 */
	public class tgbClassPathXMLApplicationContext {
		
		private List beanDefines =new ArrayList();
		private Map sigletons =new HashMap();
		
		
		public tgbClassPathXMLApplicationContext(String filename){
			this.readXML(filename);
			this.instanceBeans();
		}
	
		/**
		 *   bean    
		 */
		private void instanceBeans() {
			for(BeanDefinition beanDefinition :  beanDefines){
				try {
					if(beanDefinition.getClassName()!=null && !"".equals(beanDefinition.getClassName().trim())){
					  sigletons.put(beanDefinition.getId(),Class.forName(beanDefinition.getClassName()).newInstance());
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				
			}
			
		}
	
		/**
		 *   xml    
		 * @param filename
		 */
		private void readXML(String filename) {
			SAXReader saxReader = new SAXReader(); //     
			Document document =null;
			try{
				URL xmlpath = this.getClass().getClassLoader().getResource(filename);
				document =saxReader.read(xmlpath);
				Map nsMap =new HashMap();
				nsMap.put("ns","http://www.springframework.org/schema/beans"); //      
				XPath xsub = document.createXPath("//ns:beans/ns:bean"); //  beans/bean    
				 xsub.setNamespaceURIs(nsMap); //       
				List beans = xsub.selectNodes(document); //         bean  
				for(Element element:beans){
					String id =element.attributeValue("id"); //   id   
					String clazz =element.attributeValue("class"); //   class   
					BeanDefinition beanDefine =new BeanDefinition(id,clazz);
					beanDefines.add(beanDefine);
				}
			
			} catch(Exception e){
				e.printStackTrace();
			}
			
		}
		
		/**
		 *   bean  
		 * @param beanName
		 * @return
		 */
		public Object getBean(String beanName){
			return this.sigletons.get(beanName);
		}
	}
     このクラスにはList汎型集合類と一つのMap集合があります.コードを確認することによって、この容器類のやっていることが分かります.
    a.プロファイルbean.xmlを読み込み、ファイル中のbeanのidに従って、class属性を実際的にビーンDefinitionにして、パンチングセットに入れる.
    b.サイクル+反射により、ListのbeanをMapに追加し、ここではbeanのclassName属性を一例化したbeanオブジェクトに反射してMapに加える.
    c.外部インターフェースを提供し、着信パラメータによってbeanを取得する.
  4.次は容器類を通じて具体的なbeanコードを取得します.
	public class SpringTest {
		@Test
		public void instanceSpring(){
			tgbClassPathXMLApplicationContext ctx =new tgbClassPathXMLApplicationContext("beans.xml");	
			PersonService personService =(PersonService) ctx.getBean("personService");
			personService.save();
		}
	}
save()メソッドを呼び出すことにより、異動できます.
PersonServiceBenに行きます.
このようなデモによって、Spring容器のすることがはっきり見えます.それは初期化の時に配置ファイルの中でbeanと対応関係の配置をすべてApple Contactに参加して、一連の転換を通じてこれらのbeanを実際化して、beanはそれに管理されて、だからApplication Contectは1つの容器の役を演じました.