模拟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>