1 ClassPathResource classPathResource=new ClassPathResource("spring-mvc.xml"); 2 DefaultListableBeanFactory factory=new DefaultListableBeanFactory(); 3 XmlBeanDefinitionReader reader=new XmlBeanDefinitionReader(factory); 4 reader.loadBeanDefinitions(classPathResource);
1 //IOC 容器加载的核心方法 2 public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException { 3 try { 4 InputStream inputStream = encodedResource.getResource().getInputStream(); 5 try { 6 //一:读取xml文件 7 InputSource inputSource = new InputSource(inputStream); 8 if (encodedResource.getEncoding() != null) { 9 inputSource.setEncoding(encodedResource.getEncoding()); 10 } 11 //二:加载 beanefinition 12 var5 = this.doLoadBeanDefinitions(inputSource, encodedResource.getResource()); 13 } finally { 14 inputStream.close(); 15 } 16 } 17 18 return var5; 19 } 20 } 21 22 23 protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource) throws BeanDefinitionStoreException { 24 try { 25 //一 1) 将xml文件转换为document 26 Document doc = this.doLoadDocument(inputSource, resource); 27 return this.registerBeanDefinitions(doc, resource); 28 } 29 } 30 31 //一 2) 开始执行 32 public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) { 33 this.readerContext = readerContext; 34 this.logger.debug("Loading bean definitions"); 35 Element root = doc.getDocumentElement(); 36 this.doRegisterBeanDefinitions(root); 37 } 38 39 protected void doRegisterBeanDefinitions(Element root) { 40 41 this.preProcessXml(root); 42 //三 解析Element 获取xml内容 43 this.parseBeanDefinitions(root, this.delegate); 44 this.postProcessXml(root); 45 this.delegate = parent; 46 } 47 //解析Element 得到node 判断node内容 48 protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) { 49 if (delegate.isDefaultNamespace(root)) { 50 NodeList nl = root.getChildNodes(); 52 for(int i = 0; i < nl.getLength(); ++i) { 53 Node node = nl.item(i); 54 if (node instanceof Element) { 55 Element ele = (Element)node; 56 if (delegate.isDefaultNamespace(ele)) { 57 //读取document的内容 58 this.parseDefaultElement(ele, delegate); 59 } else { 60 delegate.parseCustomElement(ele); 61 } 62 } 63 } 64 } else { 65 delegate.parseCustomElement(root); 66 } 67 68 } 69 70 //四 判断xml中(document中节点的类型) 71 private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) { 72 if (delegate.nodeNameEquals(ele, "import")) { 73 this.importBeanDefinitionResource(ele); 74 } else if (delegate.nodeNameEquals(ele, "alias")) { 75 this.processAliasRegistration(ele); 76 } else if (delegate.nodeNameEquals(ele, "bean")) {
//五 载入beanDefinition 77 this.processBeanDefinition(ele, delegate); 78 } else if (delegate.nodeNameEquals(ele, "beans")) { 79 this.doRegisterBeanDefinitions(ele); 80 } 81 82 } 83 protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) { 84 BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele); 85 if (bdHolder != null) { 86 bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder); 87 88 try { 89 BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, this.getReaderContext().getRegistry()); 90 } catch (BeanDefinitionStoreException var5) { 91 this.getReaderContext().error("Failed to register bean definition with name ‘" + bdHolder.getBeanName() + "‘", ele, var5); 92 } 93 94 this.getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder)); 95 } 96 97 } 98 //六 注册 BeanDefinitionReaderUtils 99 public static void registerBeanDefinition(BeanDefinitionHolder definitionHolder, BeanDefinitionRegistry registry) throws BeanDefinitionStoreException { 100 //获取bean的名称 101 String beanName = definitionHolder.getBeanName(); 102 // 注册bean 并将bean放入到ioc容器里面 103 registry.registerBeanDefinition(beanName, definitionHolder.getBeanDefinition()); 104 String[] aliases = definitionHolder.getAliases(); 105 if (aliases != null) { 106 String[] var4 = aliases; 107 int var5 = aliases.length; 108 109 for(int var6 = 0; var6 < var5; ++var6) { 110 String alias = var4[var6];
111 //七 加载其他信息 如:是否是单例,是否允许重载 是否是abstract 类等 112 registry.registerAlias(beanName, alias); 113 } 114 } 115 116 } 117 //DefaultListableBeanFactory 118 public void registerBeanDefinition(String beanName, BeanDefinition beanDefinition) throws BeanDefinitionStoreException { 119 Assert.hasText(beanName, "Bean name must not be empty"); 120 Assert.notNull(beanDefinition, "BeanDefinition must not be null"); 121 if (beanDefinition instanceof AbstractBeanDefinition) { 122 try { 123 ((AbstractBeanDefinition)beanDefinition).validate(); 124 } catch (BeanDefinitionValidationException var9) { 125 throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName, "Validation of bean definition failed", var9); 126 } 127 } 128 //bean 已经存在 129 BeanDefinition existingDefinition = (BeanDefinition)this.beanDefinitionMap.get(beanName); 130 if (existingDefinition != null) { 131 //不允许覆盖 报异常 132 if (!this.isAllowBeanDefinitionOverriding()) { 133 throw new BeanDefinitionStoreException(beanDefinition.getResourceDescription(), beanName, "Cannot register bean definition [" + beanDefinition + "] for bean ‘" + beanName + "‘: There is already [" + existingDefinition + "] bound."); 134 } 137 this.beanDefinitionMap.put(beanName, beanDefinition); 138 } else { 139 if (this.hasBeanCreationStarted()) { 140 Map var4 = this.beanDefinitionMap; 141 synchronized(this.beanDefinitionMap) { 142 //将bean放入容器 143 this.beanDefinitionMap.put(beanName, beanDefinition); 144 List<String> updatedDefinitions = new ArrayList(this.beanDefinitionNames.size() + 1); 145 updatedDefinitions.addAll(this.beanDefinitionNames); 146 updatedDefinitions.add(beanName); 147 this.beanDefinitionNames = updatedDefinitions; 148 if (this.manualSingletonNames.contains(beanName)) { 149 Set<String> updatedSingletons = new LinkedHashSet(this.manualSingletonNames); 150 updatedSingletons.remove(beanName); 151 this.manualSingletonNames = updatedSingletons; 152 } 153 } 154 } else { 155 this.beanDefinitionMap.put(beanName, beanDefinition); 156 this.beanDefinitionNames.add(beanName); 157 this.manualSingletonNames.remove(beanName); 158 } 159 160 this.frozenBeanDefinitionNames = null; 161 } 162 163 if (existingDefinition != null || this.containsSingleton(beanName)) { 164 this.resetBeanDefinition(beanName); 165 } 166 167 }
是一个接口,里面定义了一些bean的元数据,如beanName,score等
原文:https://www.cnblogs.com/fanBlog/p/12667285.html