`
evan_yang
  • 浏览: 1990 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

利用java发射机制模拟spring的IOC

    博客分类:
  • SSH
阅读更多

//通过一个简单的程序来模拟Spring的IOC,这里只写了set注入。

package com.ioc;

public interface BeanFactory {
	
	/**
	 * Load your config file (such as:bean.xml)
	 * @param fileName 配置文件的名字
	 */
	void loadConfigFile(String fileName);
	
	
	/**
	 * 
	 * @param beanName 
	 * @return
	 */
	Object getBean(String beanName);

}



package com.ioc;

public class UserBean {
	
	private String userName;
	private String password;
	
	public String getUserName() {
		return userName;
	}
	public void setUserName(String userName) {
		this.userName = userName;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	
}


package com.ioc;

import java.beans.BeanInfo;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import org.dom4j.Attribute;
import org.dom4j.Document;
import org.dom4j.Element;
import org.dom4j.io.SAXReader;

public class BeanFactoryImpl implements BeanFactory {
	
	 private Map<String, Object> beanMap = new HashMap<String, Object>();

	@Override
	public void loadConfigFile(String fileName) {
		try {
			SAXReader reader = new SAXReader();
			ClassLoader loader = Thread.currentThread().getContextClassLoader();
			InputStream ins = loader.getResourceAsStream(fileName);
			Document doc = reader.read(ins);
			Element root = doc.getRootElement();
			for(Iterator<?> it = root.elementIterator("bean");it.hasNext();){
				
				Element foo = (Element) it.next();
				//得到Bean的属性:id和class.
				Attribute id = foo.attribute("id");
				Attribute cla = foo.attribute("class");
				
				//利用发射机制得到该class的类。
				Class<?> beanClass = Class.forName(cla.getText());
				
				BeanInfo info = Introspector.getBeanInfo(beanClass);
				PropertyDescriptor pd[] = info.getPropertyDescriptors();
				
				Method methodSet = null;
				Object obj = beanClass.newInstance();
				
				//遍历该bean的property属性并获取其值
				for(Iterator<?> ite = foo.elementIterator("property");ite.hasNext();){
					
					Element foo2 = (Element) ite.next();
					Attribute name = foo2.attribute("name");
					
					//获取该property的子元素value的值
					String value = "";
					for(Iterator<?> iter = foo2.elementIterator("value");iter.hasNext();){
						
						Element foo3 = (Element) iter.next();
						value = foo3.getText();
						
					}
					for(int i=0;i<pd.length;i++){
						if(pd[i].getName().equalsIgnoreCase(name.getText())){
							methodSet = pd[i].getWriteMethod();
							methodSet.invoke(obj, value);
							
						}
					}
					
				}
				
				beanMap.put(id.getText(), obj);
			}
			
		} catch (Exception e) {
			System.out.println(e.getMessage());
			e.printStackTrace();
		}

		
	}

	@Override
	public Object getBean(String beanName) {
		
		Object obj = beanMap.get(beanName);
        return obj;
	}

}



package test;

import com.ioc.BeanFactoryImpl;
import com.ioc.UserBean;

public class IOCTest {

	public static void main(String[] args) {
		
		BeanFactoryImpl factory = (BeanFactoryImpl) ObjectFactory.getInstance();

		factory.loadConfigFile("bean.xml");

		UserBean user = (UserBean) factory.getBean("javaBean");

		System.out.println("userName= " + user.getUserName());
		System.out.println("passoerd= " + user.getPassword());
	}

}



bean.xml:
<?xml version="1.0" encoding="UTF-8"?>
<beans>
    <bean id="javaBean" class="com.ioc.UserBean">
       <property name="userName">
           <value>Evan Yang</value>
       </property>
       <property name="password">
           <value>admin</value>
       </property>
    </bean>
</beans>



分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics