模擬Spring控制反轉IOC
Spring中核心思想控制反轉或者稱依賴注入
/**
*
* 模擬Spring控制反轉
* @author Administrator
*
*/
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 {
/**
* 讀取所有配置,保存到list中
*/
SAXBuilder sb=new SAXBuilder();
Document doc=sb.build(this.getClass().getClassLoader().getResourceAsStream("beans.xml")); //構建文檔對象
Element root=doc.getRootElement(); //獲取根元素
List list=root.getChildren("bean");//獲取所有bean子對象
/**
* 遍歷bean配置,把對象保存中map中
*/
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);
/**
* 當讀取到bean中存在property時,把內置對象就setter進去,由於配置關係,我們已經提前放如map中了。
*/
for(Element propertyElement : (List<Element>)element.getChildren("property")) {
String name = propertyElement.getAttributeValue("name"); //userDAO
String bean = propertyElement.getAttributeValue("bean"); //u
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);
}
}
配置文件如下。
<?xml version="1.0" encoding="UTF-8"?>
<beans>
<bean id="u" class="cn.simplemang.spring.dao.impl.UserDAOImpl" />
<bean id="userService" class="cn.simplemang.spring.service.UserService">
<property name="userDAO" bean="u"/>
</bean>
</beans>