spring IOC達到松耦合的目的,便于測試。我很喜歡"spirng容器"的說法,spring根據讀取bean.xml,再用java反射機制,組合一些類,完成程序。其實,實現起來也不太難。不信你看。
模仿spring,BeanFactory
package com.wang.spring;

public interface BeanFactory {
public Object getBean(String name);
}
主要類:ClassPathXmlApplicationContext,當然spring的這個類里有國際化等功能實現,這里就簡了。
package com.wang.spring;

import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;

import wang.spring.dao.UserDao;
import wang.spring.dao.impl.UserDaoImpl;

public class ClassPathXmlApplicationContext implements BeanFactory {

private Map<String, Object> beans = new HashMap<String, Object>();

// IOC Inverse of Control DI Dependency Injection
public ClassPathXmlApplicationContext() throws Exception {
SAXBuilder sb = new SAXBuilder();

Document doc = sb.build(this.getClass().getClassLoader()
.getResourceAsStream("beans.xml")); // 構造文檔對象
Element root = doc.getRootElement(); // 獲取根元素HD
List list = root.getChildren("bean");// 取名字為disk的所有元素
for (int i = 0; i < list.size(); i++) {
Element element = (Element) list.get(i);
String id = element.getAttributeValue("id");
String clazz = element.getAttributeValue("class");
Object o = Class.forName(clazz).newInstance();
System.out.println(id);
System.out.println(clazz);
beans.put(id, o);//i=1 new UserDaoImpl();

for (Element propertyElement : (List<Element>) element
.getChildren("property")) {
String name = propertyElement.getAttributeValue("name"); // 得到userDAO
String bean = propertyElement.getAttributeValue("bean"); // u
//相當于 UserDao u = new UserDaoImpl();
Object beanObject = beans.get(bean);// UserDAOImpl instance

String methodName = "set" + name.substring(0, 1).toUpperCase()
+ name.substring(1);
System.out.println("method name = " + methodName);

Method m = o.getClass().getMethod(methodName,
beanObject.getClass().getInterfaces()[0]);
m.invoke(o, beanObject);
}

}

}

public Object getBean(String id) {
return beans.get(id);
}

}
模仿spring,BeanFactory






主要類:ClassPathXmlApplicationContext,當然spring的這個類里有國際化等功能實現,這里就簡了。




























































