아 날로 그 Spring IOC

이 시 뮬 레이 션 이 실 현 된 기능: 다음 xml 파일 의 bean 을 spring 용기 에 불 러 오고 studentDao 를 studentService 에 주입 한 다음 getBean () 을 통 해 bean 을 가 져 옵 니 다.
<?xml version="1.0" encoding="UTF-8"?>
<beans>
	<bean id="studentDao" class="com.zju.test.StudentDao"></bean>
	
	<bean id="studentService" class="com.zju.test.StudentService" >
		<property name="studentDao" ref="studentDao"/>
	</bean>
</beans>

1. 데이터 구조의 정의:
Spring 에서 BeanDefinition 데이터 구조 로 데 이 터 를 밀봉 합 니 다.
BeanDefinition 클래스:
package com.zju.xiaoye.bean;

import java.util.ArrayList;
import java.util.List;

/**
 * BeanDefinition     
 * 
 * @author xiaoye
 * 
 */
public class BeanDefinition {
	private String id;   //bean id
	private String className; //bean className
	private List<PropertyDefinition> properties = new ArrayList<PropertyDefinition>();  //  bean property   

	public BeanDefinition(String id, String className) {
		this.id = id;
		this.className = className;
	}

	public BeanDefinition() {
	}

	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;
	}

	public List<PropertyDefinition> getProperties() {
		return properties;
	}

	public void setProperties(List<PropertyDefinition> properties) {
		this.properties = properties;
	}

}

 PropertyDefinition 의 정 의 는 다음 과 같다.
package com.zju.xiaoye.bean;

public class PropertyDefinition {
	private String name;  //name  
	private String ref;  //ref  

	public PropertyDefinition(String name, String ref) {
		this.name = name;
		this.ref = ref;
	}

	public PropertyDefinition() {
	}

	public String getName() {
		return name;
	}

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

	public String getRef() {
		return ref;
	}

	public void setRef(String ref) {
		this.ref = ref;
	}

}

2. 아 날로 그 용기 의 실현
아 날로 그 용기 류 MockSpringXmlApplication Context 의 주요 구 조 는 다음 과 같다.
package com.zju.xiaoye.context;

import ......

public class MockSpringXmlApplicationContext {
	//BeanDefinition   List
	private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();
	
	//         beanDefinitionMap
	private Map<String, Object> beanDefinitionMap = new HashMap<String, Object>(); 
	
	/**
	 * MockSpringXmlApplicationContext    
	 *     xml  readXml(fileName);
	 *    Beans  initBeas();
	 *       inject();
	 * @param fileName
	 */
	public MockSpringXmlApplicationContext(String fileName){
		this.readXml(fileName);
		this.initBeans();
		this.inject();
	}
	
	/**
	 *   xml        
	 *   bean    beanDefines 
	 * @param fileName
	 */
	private void readXml(String fileName){
		.......
	}
	
	/**
	 *   beanDefines bean  map 
	 */
	private void initBeans(){
		......
	}
	
	/**
	 *   set        
	 *   beanDefines  ,   beanDefinition,  property       
	 */
	private void inject(){
		......
	}
	
	/**
	 *   id      bean
	 * @param id
	 * @return
	 */
	public Object getBean(String id){
		return beanDefinitionMap.get(id);
	}
	
}

 다음은 주요 한 방법 실현 을 소개 한다.
  1) readXml (String fileName): dom4j 로 xml 파일 분석
private void readXml(String fileName){
		SAXReader saxReader = new SAXReader();
		Document document  = null;
		try {
			document = saxReader.read(new File(fileName));
			Element root = document.getRootElement();
			for(Iterator rootIter = root.elementIterator("bean"); rootIter.hasNext();){
				Element beanNode = (Element) rootIter.next();
				
				BeanDefinition beanDefinition = new BeanDefinition(beanNode.attributeValue("id"), beanNode.attributeValue("class"));
				
				for(Iterator beanIter = beanNode.elementIterator(); beanIter.hasNext();){
					Element property = (Element) beanIter.next();
					PropertyDefinition propertyDefinition = new PropertyDefinition(property.attributeValue("name"),property.attributeValue("ref"));
					beanDefinition.getProperties().add(propertyDefinition);
				}
				beanDefines.add(beanDefinition);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}
 
2)initBeans()
private void initBeans(){
		for(BeanDefinition bean : beanDefines){
			if(bean.getClassName()!=null && !"".equals(bean.getClassName().trim())){
				try {
					beanDefinitionMap.put(bean.getId(), Class.forName(bean.getClassName()).newInstance());//      
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

3)inject()
private void inject(){
		for(BeanDefinition beanDefinition : beanDefines){
			Object bean = beanDefinitionMap.get(beanDefinition.getId());
			if(bean!=null){
				try {
					PropertyDescriptor [] ps = Introspector.getBeanInfo(bean.getClass()).getPropertyDescriptors();
					for(PropertyDefinition propertyDefinition : beanDefinition.getProperties()){
						for(PropertyDescriptor propertyDesc : ps){
							if(propertyDesc.getName().equals(propertyDefinition.getName())){
								Method setter = propertyDesc.getWriteMethod();//     set  
								if(setter!=null){
									Object value = beanDefinitionMap.get(propertyDefinition.getRef());
									setter.setAccessible(true); //  private
									setter.invoke(bean, value);//          
								}
								break;
							}
						}
					}
					
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		}
	}

좋은 웹페이지 즐겨찾기