Spring中有两个重要概念之一--- IOC (inversion of control) 控制反转,就是对象由beanfactory产生对象,beanfactory里面有一个容器,他加载类对象,容器是一个map。java
实现简单模拟beanfactory:spring
//调用程序app
public class Test { public static void main(String[] args) throws Exception{ BeanFactory f = new ClassPathXmlApplicationContext("com/d12321/applicationContext.xml"); Object o = f.getBean("v"); } }
//beanfactory接口dom
public interface BeanFactory { Object getBean(String id) throws Exception; }
//实现接口的ClassPathXmlApplicationContext对象ide
public class ClassPathXmlApplicationContext implements BeanFactory { private Map<String,Object> container = new HashMap<String, Object>(); //模拟spring的容器 public ClassPathXmlApplicationContext(String filename) throws Exception { SAXBuilder sb = new SAXBuilder(); Document doc = sb.build(Test.class.getClassLoader().getResourceAsStream(filename)); Element root = doc.getRootElement(); List list = XPath.selectNodes(root, "/beans/bean"); for(int i = 0; i < list.size(); i++) { Element elem = (Element) list.get(i); String it = elem.getAttributeValue("id"); String value = elem.getAttributeValue("value"); Object o = Class.forName(value).newInstance(); container.put(it, o); } } @Override public Object getBean(String id) { return container.get(id); } }
//类对象ui
public class Car { Car() { System.out.println("car ...."); } }
//applicationContext.xmlxml
<?xml version="1.0" encoding="UTF-8"?> <beans> <bean id="v" value="com.d12321.Car"> </bean>> </beans
总结:对象
1.模拟中用到的重要技术,jdom解析xml文件接口
2.Class.forname(类名).newInstance();产生一个类对象get
3.(类名).getClass().getClassLoader().getResourceAsStream("xx/xx/xx.xml"); exp: Document doc = sb.build(Test.class.getClassLoader().getResourceAsStream(filename));