public void refresh() throws BeansException, IllegalStateException {synchronized (this.startupShutdownMonitor) {// Prepare this context for refreshing.prepareRefresh();// Tell the subclass to refresh the internal bean factory.//這里是在子類(lèi)中啟動(dòng)refreshBeanFactory()的地方,也就是創(chuàng)建實(shí)際BeanFactory的方法入口ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();// Prepare the bean factory for use in this context.prepareBeanFactory(beanFactory);try {// Allows post-processing of the bean factory in context subclasses.//設(shè)置BeanFactory的后置處理postProcessBeanFactory(beanFactory);// Invoke factory processors registered as beans in the context.//調(diào)用BeanFactory的后處理器.這些后處理器是在Bean定義中向容器注冊(cè)的invokeBeanFactoryPostProcessors(beanFactory);// Register bean processors that intercept bean creation.//注冊(cè)Bean的后處理器,在Bean創(chuàng)建過(guò)程中調(diào)用。registerBeanPostProcessors(beanFactory);// Initialize message source for this context.、//對(duì)上下文中的消息源進(jìn)行初始化initMessageSource();// Initialize event multicaster for this context.//初始化上下文中的事件機(jī)制initApplicationEventMulticaster();// Initialize other special beans in specific context subclasses.//初始化其他的特殊BeanonRefresh();// Check for listener beans and register them.//檢查監(jiān)聽(tīng)Bean并且將這些Bean向容器注冊(cè)registerListeners();// Instantiate all remaining (non-lazy-init) singletons.//實(shí)例化所有的(non-lazy-init)單件finishBeanFactoryInitialization(beanFactory);// Last step: publish corresponding event.//發(fā)布容器事件.結(jié)束Refresh過(guò)程finishRefresh();}catch (BeansException ex) {// Destroy already created singletons to avoid dangling resources.//為防止Bean資源占用,在異常處理中,銷(xiāo)毀已經(jīng)在前面過(guò)程中生成的單間BeandestroyBeans();// Reset 'active' flag.cancelRefresh(ex);// Propagate exception to caller.throw ex;}}}
//DefaultBeanDefinitionDocumentReader中的registerBeanDefinitions方法
public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {//將封裝了XmlBeanDefinitionReader等組件的XmlReaderContext傳給DefaultBeanDefinitionDocumentReader,方便后續(xù)回調(diào)。this.readerContext = readerContext;logger.debug("Loading bean definitions");Element root = doc.getDocumentElement();doRegisterBeanDefinitions(root);
}//DefaultBeanDefinitionDocumentReader中的doRegisterBeanDefinitions方法
protected void doRegisterBeanDefinitions(Element root) {String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);if (StringUtils.hasText(profileSpec)) {Assert.state(this.environment != null, "environment property must not be null");String[] specifiedProfiles = StringUtils.tokenizeToStringArray(profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);if (!this.environment.acceptsProfiles(specifiedProfiles)) {return;}}// any nested <beans> elements will cause recursion in this method. In// order to propagate and preserve <beans> default-* attributes correctly,// keep track of the current (parent) delegate, which may be null. Create// the new (child) delegate with a reference to the parent for fallback purposes,// then ultimately reset this.delegate back to its original (parent) reference.// this behavior emulates a stack of delegates without actually necessitating one.//對(duì)文檔進(jìn)行解析的實(shí)際作用類(lèi)BeanDefinitionParserDelegateBeanDefinitionParserDelegate parent = this.delegate;this.delegate = createHelper(readerContext, root, parent);preProcessXml(root);//利用BeanDefinitionParserDelegate進(jìn)行解析的入口方法parseBeanDefinitions(root, this.delegate);postProcessXml(root);this.delegate = parent;
}//DefaultBeanDefinitionDocumentReader中的parseBeanDefinitions方法
//遍歷子節(jié)點(diǎn),也就是XML文件中的標(biāo)簽,依次解析
protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {if (delegate.isDefaultNamespace(root)) {NodeList nl = root.getChildNodes();for (int i = 0; i < nl.getLength(); i++) {Node node = nl.item(i);if (node instanceof Element) {Element ele = (Element) node;if (delegate.isDefaultNamespace(ele)) {parseDefaultElement(ele, delegate);}else {delegate.parseCustomElement(ele);}}}}else {delegate.parseCustomElement(root);}
}//DefaultBeanDefinitionDocumentReader中的parseDefaultElement方法
private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {//對(duì)"import"標(biāo)簽進(jìn)行處理if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {importBeanDefinitionResource(ele);}//對(duì)"alias"標(biāo)簽進(jìn)行處理else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {processAliasRegistration(ele);}//對(duì)"bean"標(biāo)簽進(jìn)行處理,是主要的解析標(biāo)簽。else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {processBeanDefinition(ele, delegate);}//對(duì)"beans"標(biāo)簽進(jìn)行處理else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {// recursedoRegisterBeanDefinitions(ele);}
}//DefaultBeanDefinitionDocumentReader中的processBeanDefinition方法
protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {//由BeanDefinitionParserDelegate負(fù)責(zé)解析,BeanDefinitionHolder是BeanDefinition的//封裝類(lèi),用于完成向IoC容器的注冊(cè)BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);if (bdHolder != null) {bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);try {// Register the final decorated instance.//載入解析完,注冊(cè)的入口函數(shù)BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());}catch (BeanDefinitionStoreException ex) {getReaderContext().error("Failed to register bean definition with name '" +bdHolder.getBeanName() + "'", ele, ex);}// Send registration event.getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));}
}
//BeanDefinitionParserDelegate中的parsePropertySubElement方法,對(duì)property的子標(biāo)簽進(jìn)行解析
public Object parsePropertySubElement(Element ele, BeanDefinition bd, String defaultValueType) {if (!isDefaultNamespace(ele)) {return parseNestedCustomElement(ele, bd);}//子標(biāo)簽為bean的解析else if (nodeNameEquals(ele, BEAN_ELEMENT)) {BeanDefinitionHolder nestedBd = parseBeanDefinitionElement(ele, bd);if (nestedBd != null) {nestedBd = decorateBeanDefinitionIfRequired(ele, nestedBd, bd);}return nestedBd;}//子標(biāo)簽為ref的解析else if (nodeNameEquals(ele, REF_ELEMENT)) {// A generic reference to any name of any bean.String refName = ele.getAttribute(BEAN_REF_ATTRIBUTE);boolean toParent = false;if (!StringUtils.hasLength(refName)) {// A reference to the id of another bean in the same XML file.refName = ele.getAttribute(LOCAL_REF_ATTRIBUTE);if (!StringUtils.hasLength(refName)) {// A reference to the id of another bean in a parent context.refName = ele.getAttribute(PARENT_REF_ATTRIBUTE);toParent = true;if (!StringUtils.hasLength(refName)) {error("'bean', 'local' or 'parent' is required for <ref> element", ele);return null;}}}if (!StringUtils.hasText(refName)) {error("<ref> element contains empty target attribute", ele);return null;}RuntimeBeanReference ref = new RuntimeBeanReference(refName, toParent);ref.setSource(extractSource(ele));return ref;}//子標(biāo)簽為idref的解析else if (nodeNameEquals(ele, IDREF_ELEMENT)) {return parseIdRefElement(ele);}//子標(biāo)簽為value的解析else if (nodeNameEquals(ele, VALUE_ELEMENT)) {return parseValueElement(ele, defaultValueType);}else if (nodeNameEquals(ele, NULL_ELEMENT)) {// It's a distinguished null value. Let's wrap it in a TypedStringValue// object in order to preserve the source location.TypedStringValue nullHolder = new TypedStringValue(null);nullHolder.setSource(extractSource(ele));return nullHolder;}//子標(biāo)簽為array的解析else if (nodeNameEquals(ele, ARRAY_ELEMENT)) {return parseArrayElement(ele, bd);}//子標(biāo)簽為list的解析else if (nodeNameEquals(ele, LIST_ELEMENT)) {return parseListElement(ele, bd);}//子標(biāo)簽為set的解析else if (nodeNameEquals(ele, SET_ELEMENT)) {return parseSetElement(ele, bd);}//子標(biāo)簽為map的解析else if (nodeNameEquals(ele, MAP_ELEMENT)) {return parseMapElement(ele, bd);}else if (nodeNameEquals(ele, PROPS_ELEMENT)) {return parsePropsElement(ele);}else {error("Unknown property sub-element: [" + ele.getNodeName() + "]", ele);return null;}}//BeanDefinitionParserDelegate中的parseListElement方法,解析list標(biāo)簽,將解析結(jié)果封裝在ManagedList中。
public List parseListElement(Element collectionEle, BeanDefinition bd) {String defaultElementType = collectionEle.getAttribute(VALUE_TYPE_ATTRIBUTE);NodeList nl = collectionEle.getChildNodes();ManagedList<Object> target = new ManagedList<Object>(nl.getLength());target.setSource(extractSource(collectionEle));target.setElementTypeName(defaultElementType);target.setMergeEnabled(parseMergeAttribute(collectionEle));//開(kāi)始解析list下的標(biāo)簽parseCollectionElements(nl, target, bd, defaultElementType);return target;}protected void parseCollectionElements(NodeList elementNodes, Collection<Object> target, BeanDefinition bd, String defaultElementType) {for (int i = 0; i < elementNodes.getLength(); i++) {Node node = elementNodes.item(i);if (node instanceof Element && !nodeNameEquals(node, DESCRIPTION_ELEMENT)) {//加入到target中,target是一個(gè)ManagedList,同時(shí)開(kāi)始對(duì)下一層子元素的解析過(guò)程。是一個(gè)遞歸調(diào)用。target.add(parsePropertySubElement((Element) node, bd, defaultElementType));}}}