제8 강-코딩 분석 Spring 조립 기본 속성의 원리


    다음은 아 날로 그 스프링 용 기 를 사용 하여 스프링 용기 의 기본 유형의 주입 을 완성 할 것 인가,아니면 ItcastClassPathXMLapplicationContext.java 를 사용 할 것 인가  spring 용기 주입 String 형식,int 형식 등 기본 형식 을 모 의 합 니 다.이전 에는 ref 참조 의존 대상 이 었 습 니 다.
 
 
단계:우선 PersionServiceBean.java 에 string 형식의 변수 name,int 형식의 변수 age 를 추가 합 니 다.
package cn.com.xinli.service.impl;

import org.apache.log4j.Logger;

import cn.com.xinli.dao.PersionDao;
import cn.com.xinli.service.PersionSevice;
										   
public class PersionServiceBean implements PersionSevice 
{
	Logger log=Logger.getLogger(PersionServiceBean.class);
	private PersionDao persionDao;
	private String name;
	private int age;
	public int getAge()
	{
		return age;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public PersionDao getPersionDao()
	{
		return persionDao;
	}
	public void setPersionDao(PersionDao persionDao)
	{
		this.persionDao = persionDao;
	}
	public void init()
	{
		log.info("     ");
	}
	public PersionServiceBean() 
	{
		log.info("      ");
	}

	public void save()
	{
		log.info("name:"+name);
		log.info("age:"+age);
		 this.persionDao.add();
	}
	public void destory()
	{
		log.info("    ");
	}
}	

 
(2)ItcastClassPathXMLapplicationContext 용기 코드 를 수정 합 니 다.주로 용기 에서 beans.xml 프로필 을 읽 을 때 속성의 값 을 읽 고 주입 할 때 기본 형식 에 대한 주입 을 완성 합 니 다.Property Definition.자바 에 value 속성 과 get,set 방법 을 수정 해 야 합 니 다.
 
 
package junit.test;

import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.Method;
import java.net.URL;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.beanutils.ConvertUtils;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.XPath;
import org.dom4j.io.SAXReader;
import org.springframework.core.Conventions;

/**
 *    spring       
 *
 */
public class ItcastClassPathXMLApplicationContext 
{	
	Logger log=Logger.getLogger(ItcastClassPathXMLApplicationContext.class);
	private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
	private Map<String, Object> sigletons = new HashMap<String, Object>();
	
	public ItcastClassPathXMLApplicationContext(String filename){
		this.readXML(filename);
		this.instanceBeans();
		this.injectObject();
	}
	
	/**
	 *       
	 */
	private void injectObject() 
	{
		for(BeanDefinition beanDefinition : beanDefines){
			Object bean = sigletons.get(beanDefinition.getId());
			if(bean!=null)
			{
				try
				{
					//  bean         ,        
					PropertyDescriptor[] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
					for(PropertyDefinition propertyDefinition : beanDefinition.getPropertys())
					{
						for(PropertyDescriptor properdesc : ps)
						{
							//  xml         bean       
							if(propertyDefinition.getName().equals(properdesc.getName()))
							{
								//setter      
								Method setter = properdesc.getWriteMethod();
								//     setter   ,     private    
								if(setter!=null)
								{
									if(propertyDefinition.getRef()!=null && !"".equals(propertyDefinition.getRef()))
									{
										Object value = sigletons.get(propertyDefinition.getRef());
										setter.setAccessible(true);
										setter.invoke(bean, value);//          
										
									}
									else
									{
										
										Object value = ConvertUtils.convert(propertyDefinition.getValue(), properdesc.getPropertyType());
										setter.setAccessible(true);
										setter.invoke(bean, value);//          
									}
									
								}
								break;
							}
						}
					}
				} 
				catch (Exception e) 
				{
				}
			}
		}
	}
	/**
	 *   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) {
				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<String,String> nsMap = new HashMap<String,String>();
	         nsMap.put("ns","http://www.springframework.org/schema/beans");//      
	         XPath xsub = document.createXPath("//ns:beans/ns:bean");//  beans/bean    
	         xsub.setNamespaceURIs(nsMap);//      
	         List<Element> 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);
	            XPath propertysub =  element.createXPath("ns:property");
	            propertysub.setNamespaceURIs(nsMap);//      
	            List<Element> propertys = propertysub.selectNodes(element);
	            for(Element property : propertys){	            	
	            	String propertyName = property.attributeValue("name");
	            	String propertyref = property.attributeValue("ref");
	            	String propertyValue = property.attributeValue("value");
	            	log.info(propertyValue);
	            	PropertyDefinition propertyDefinition = new PropertyDefinition(propertyName, propertyref,propertyValue);
	            	beanDefine.getPropertys().add(propertyDefinition);
	            }
	            beanDefines.add(beanDefine);
	         } 
	        }catch(Exception e){   
	            e.printStackTrace();
	        }
	}
	/**
	 *   bean  
	 * @param beanName
	 * @return
	 */
	public Object getBean(String beanName){
		return this.sigletons.get(beanName);
	}
}

 
주의:
a.빨간색 굵기 코드 는 comons-beanutils.jar 가 제공 하 는 방법 을 사 용 했 습 니 다.속성 유형 에 따라 변환 을 완성 할 수 있 고 String->int 등 을 사용 할 수 있 습 니 다.설정 파일 에 서 는 일반적으로 이렇게 쓰 여 있 기 때 문 입 니 다.이 도구 방법 은 26 개의 string 형식 을 int 형식 으로 변환 하 는 데 도움 을 줄 수 있 습 니 다.
b.파란색 코드 는 ref 가 비어 있 지 않 은 상황 에서 우 리 는 속성 에 인용 대상 을 주입 하지 않 으 면 설정 파일 의 속성 이 대표 하 는 값 을 직접 주입 합 니 다.
c.커피색 코드 표 지 는 우리 구조 속성 bean 의 사용 에 유형 을 추가 합 니 다.
 
(3)PersionServiceBean.자바 에서 우 리 는 bean.xml 의 name 과 age 속성 을 사용 하여 자신의 ItcastClassPathXMLapplicationContext 를 봅 니 다.  사용 하여 속성의 주입 을 완성 하 였 습 니 다.
 
package cn.com.xinli.service.impl;

import org.apache.log4j.Logger;

import cn.com.xinli.dao.PersionDao;
import cn.com.xinli.service.PersionSevice;
										   
public class PersionServiceBean implements PersionSevice 
{
	Logger log=Logger.getLogger(PersionServiceBean.class);
	private PersionDao persionDao;
	private String name;
	private int age;
	public int getAge()
	{
		return age;
	}
	public void setAge(int age)
	{
		this.age = age;
	}
	public String getName()
	{
		return name;
	}
	public void setName(String name)
	{
		this.name = name;
	}
	public PersionDao getPersionDao()
	{
		return persionDao;
	}
	public void setPersionDao(PersionDao persionDao)
	{
		this.persionDao = persionDao;
	}
	public void init()
	{
		log.info("     ");
	}
	public PersionServiceBean() 
	{
		log.info("      ");
	}

	public void save()
	{
		log.info("name:"+name);
		log.info("age:"+age);
		 this.persionDao.add();
	}
	public void destory()
	{
		log.info("    ");
	}
}	

 
(4)테스트
 
ItcastClassPathXMLApplicationContext ctx = new ItcastClassPathXMLApplicationContext("beans.xml");  PersionSevice ps=(PersionSevice)ctx.getBean("persionServiceBean");           ps.save();
 
(5)결과
2009-05-30 11:08:46,203  INFO(PersionServiceBean.java:44)-저 는 2009-05-30 11:08:47,187 로 예화 되 었 습 니 다.  INFO (PersionServiceBean.java:49) - name:huxl2009-05-30 11:08:47,187  INFO (PersionServiceBean.java:50) - age:262009-05-30 11:08:47,187  INFO(Persion DaoBean.java:15)-Persion DaoBean 의 add()방법 을 실 행 했 습 니 다.

좋은 웹페이지 즐겨찾기