Spring管理bean对象的原理
//管理bean对象的java类public class ClassPathXMLApplicationContext {// 这个集合用来存储获取到的XML配置文件里面的bean信息private List<BeanDefinition> beanDefines = new ArrayList<BeanDefinition>();// 这个集合用来存储根据class属性实例化的bean实例private Map<String, Object> singleton = new HashMap<String, Object>();public ClassPathXMLApplicationContext(String fileName) {this.readXML(fileName);this.instanceBeans();}//实例化所有bean对象private void instanceBeans() {// 通过循环实例化所有的bean对象for (BeanDefinition beandefine : beanDefines) {try {singleton.put(beandefine.getId(),Class.forName(beandefine.getClazz()).newInstance());} catch (Exception e) {e.printStackTrace();}}}//读取XML,把获取到的信息先封装到javabean再存入集合里面private void readXML(String fileName) {SAXReader saxReader = new SAXReader();Document document = null;try {URL xmlPath = this.getClass().getClassLoader().getResource(fileName);Map<String, String> nsMap = new HashMap<String, String>();nsMap.put("ns", "http://www.springframework.org/schema/beans"); //加入命名空间XPath xsub = document.createXPath("//ns:beans/ns:bean"); // 创建beans/bean查询路径xsub.setNamespaceURIs(nsMap); //设置命名空间List<Element> beans = xsub.selectNodes(document); // 获取文档下所有bean节点for (Element element : beans) {String id = element.attributeValue("id");String clazz = element.attributeValue("class");BeanDefinition bean = new BeanDefinition(id, clazz); // 把获取到的数据封装到JAVABEAN里面beanDefines.add(bean); // 然后把javabean加入到集合里面取}} catch (Exception e) {e.printStackTrace();}}//获取bean实例的方法private Object getBeans(String beanName) {return singleton.get(beanName);}}