spring-refresh()方法中ConfigurableListableBeanFactory beanFactory 創建流程Bean加載註冊的流程

@Override
	public void refresh() throws BeansException, IllegalStateException {
		/**
		 * 加鎖,說明併發執行,很多地方都有調用
		 * registerShutdownHook 也調用了
		 * close()方法也調有了,
		 * 容器在啓動時,不能調Close的方法
		 */
		synchronized (this.startupShutdownMonitor) {
			// Prepare this context for refreshing.
			/**
			 * 預初始化
			 */
			prepareRefresh();

			// Tell the subclass to refresh the internal bean factory.
			/**
			 *
			 * 創建BeanFactory工廠,告訴子類去刷新內部BeanFactory,
			 * 加載Bean信息,並封裝爲BeanDefinition,並註冊到BeanDefinitionRegistry
			 * key-value key :bean的id value就是BeanDefinition
			 */
			ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();

obtainFreshBeanFactory方法


protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
		//刷新創建工廠
		refreshBeanFactory();
		//返回創建好的BeanFactory
		return getBeanFactory();
	}
	@Override
	protected final void refreshBeanFactory() throws BeansException {
		/**
		 * 判斷BeanFactory是否已經有了
		 * synchronized (this.beanFactoryMonitor) {
		 * 			return (this.beanFactory != null);
		 *                }
		 */
		if (hasBeanFactory()) {
			/**
			 * 如果已經有了就銷燬
			 * protected void destroyBeans() {
			 * 		開始銷燬Bean,先調用@preDestory方法,再調用實現了Disposable接口destory方法
			 * 	getBeanFactory().destroySingletons();
			 * 	}
			 */
			destroyBeans();
			/**
			 * 清除BeanFactory就是爲null
			 * synchronized (this.beanFactoryMonitor) {
			 * 			if (this.beanFactory != null) {
			 * 				this.beanFactory.setSerializationId(null);
			 * 				this.beanFactory = null;
			 *                        }* 		}
			 */
			closeBeanFactory();
		}
		try {
			/**
			 * 創建BeanFactory默認實現DefaultListableBeanFactory
			 */
			DefaultListableBeanFactory beanFactory = createBeanFactory();
			/**
			 * 設置序列化id
			 */
			beanFactory.setSerializationId(getId());
			/**
			 * 自定義工廠的一些屬性,是否覆蓋,循環依賴
			 * if (this.allowBeanDefinitionOverriding != null) {
			 *           是否允許覆蓋bean
			 * 			beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
			 *                }
			 * 		if (this.allowCircularReferences != null) {
			 * 	        是否徨依賴
			 * 			beanFactory.setAllowCircularReferences(this.allowCircularReferences);
			 *  }
			 */
			customizeBeanFactory(beanFactory);
			/**
			 * 加載Bean,並註冊爲 BeanDefinition
			 */
			loadBeanDefinitions(beanFactory);
			synchronized (this.beanFactoryMonitor) {
			//賦值
				this.beanFactory = beanFactory;
			}
		}
		catch (IOException ex) {
			throw new ApplicationContextException("I/O error parsing bean definition source for " + getDisplayName(), ex);
		}
	}

createBeanFactory創建DefaultListableBeanFactory

protected DefaultListableBeanFactory createBeanFactory() {
		return new DefaultListableBeanFactory(getInternalParentBeanFactory());
	}

getInternalParentBeanFactory方法


protected BeanFactory getInternalParentBeanFactory() {
		return (getParent() instanceof ConfigurableApplicationContext ?
				((ConfigurableApplicationContext) getParent()).getBeanFactory() : getParent());
	}

從父類獲取有沒有BeanFactory,沒有的是null
到這裏基本就完成BeanFactory的初始化

構造方法

第一次進來是個null

public DefaultListableBeanFactory(@Nullable BeanFactory parentBeanFactory) {
		super(parentBeanFactory);
	}

在這裏插入圖片描述

AbstractAutowireCapableBeanFactory構造方法
	//參數也是null
	public AbstractAutowireCapableBeanFactory(@Nullable BeanFactory parentBeanFactory) {
		//調用無參數構造方法
		this();
		//設置父類
		setParentBeanFactory(parentBeanFactory);
	}

在這裏插入圖片描述

this()
public AbstractAutowireCapableBeanFactory() {
		super();
		//忽略BeanNameAware
		ignoreDependencyInterface(BeanNameAware.class);
		//忽略BeanFactoryAware
		ignoreDependencyInterface(BeanFactoryAware.class);
		//忽略BeanClassLoaderAware
		ignoreDependencyInterface(BeanClassLoaderAware.class);
	}

setParentBeanFactory(parentBeanFactory)

@Override
	public void setParentBeanFactory(@Nullable BeanFactory parentBeanFactory) {
		if (this.parentBeanFactory != null && this.parentBeanFactory != parentBeanFactory) {
			throw new IllegalStateException("Already associated with parent BeanFactory: " + this.parentBeanFactory);
		}
		this.parentBeanFactory = parentBeanFactory;
	}

在這裏插入圖片描述

加載Bean信息,並封裝爲BeanDefinition,並註冊到BeanDefinitionRegistry

key-value key :bean的id value就是BeanDefinition

loadBeanDefinitions(beanFactory)方法

根據上面創建的工廠來加載BeanDefinitions

	protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory) throws BeansException, IOException {
		// Create a new XmlBeanDefinitionReader for the given BeanFactory.
		/**
		 * 創建一個XmlBeanDefinitionReader解析器,讀取XML,解析XML
		 */
		XmlBeanDefinitionReader beanDefinitionReader = new XmlBeanDefinitionReader(beanFactory);

		// Configure the bean definition reader with this context's
		// resource loading environment.
		/**
		 * 給XmlBeanDefinitionReader設置Environment,ResourceLoader等Context中的一些屬性
		 */
		beanDefinitionReader.setEnvironment(this.getEnvironment());
		beanDefinitionReader.setResourceLoader(this);
		beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

		// Allow a subclass to provide custom initialization of the reader,
		// then proceed with actually loading the bean definitions.
		/**
		 * 初始化BeanDefinitionReader
		 * 提供一些自定義的初始化策略
		 */
		initBeanDefinitionReader(beanDefinitionReader);
		/**
		 * 真正加載BeanDefinitions
		 */
		loadBeanDefinitions(beanDefinitionReader);
	}

loadBeanDefinitions

	protected void loadBeanDefinitions(XmlBeanDefinitionReader reader) throws BeansException, IOException {
		/**
		 * 從資源文件中對象中加載BeanDefinition 當前應該是null
		 */
		Resource[] configResources = getConfigResources();
		if (configResources != null) {
			reader.loadBeanDefinitions(configResources);
		}
		/**
		 * 從配置文件XML中加載
		 */
		String[] configLocations = getConfigLocations();
		if (configLocations != null) {
			reader.loadBeanDefinitions(configLocations);
		}
	}

在這裏插入圖片描述

reader.loadBeanDefinitions(
public int loadBeanDefinitions(String... locations) throws BeanDefinitionStoreException {
		Assert.notNull(locations, "Location array must not be null");
		int count = 0;
		/**
		如果有多個配置文件
		*/
		for (String location : locations) {
			count += loadBeanDefinitions(location);
		}
		return count;
	}

在這裏插入圖片描述

loadBeanDefinitions方法

org.springframework.beans.factory.support.AbstractBeanDefinitionReader#loadBeanDefinitions

	public int loadBeanDefinitions(String location) throws BeanDefinitionStoreException {
		return loadBeanDefinitions(location, null);
	}

在這裏插入圖片描述

org.springframework.beans.factory.support.AbstractBeanDefinitionReader#loadBeanDefinitions

public int loadBeanDefinitions(String location, @Nullable Set<Resource> actualResources) throws BeanDefinitionStoreException {
		/**
		 * 獲取上下文資源加載器
		 * org.springframework.context.support.ClassPathXmlApplicationContext@2824dabd
		 */
		ResourceLoader resourceLoader = getResourceLoader();
		if (resourceLoader == null) {
			throw new BeanDefinitionStoreException(
					"Cannot load bean definitions from location [" + location + "]: no ResourceLoader available");
		}
		/**
		 * 判斷資源加載器是否爲ResourcePatternResolver
		 */
		if (resourceLoader instanceof ResourcePatternResolver) {
			// Resource pattern matching available.
			try {
				/**
				 * 統一轉換爲Resource資源
				 */
				Resource[] resources = ((ResourcePatternResolver) resourceLoader).getResources(location);
				/**
				 * 加載資源文件中的配置數量 這個是核心方法
				 */
				int count = loadBeanDefinitions(resources);
				if (actualResources != null) {
					Collections.addAll(actualResources, resources);
				}
				if (logger.isTraceEnabled()) {
					logger.trace("Loaded " + count + " bean definitions from location pattern [" + location + "]");
				}
				return count;
			}
			catch (IOException ex) {
				throw new BeanDefinitionStoreException(
						"Could not resolve bean definition resource pattern [" + location + "]", ex);
			}
		}
		else {
			// Can only load single resources by absolute URL.
			Resource resource = resourceLoader.getResource(location);
			int count = loadBeanDefinitions(resource);
			if (actualResources != null) {
				actualResources.add(resource);
			}
			if (logger.isTraceEnabled()) {
				logger.trace("Loaded " + count + " bean definitions from location [" + location + "]");
			}
			return count;
		}
	}

org.springframework.beans.factory.support.AbstractBeanDefinitionReader#loadBeanDefinitions

loadBeanDefinitions核心方法

	public int loadBeanDefinitions(Resource... resources) throws BeanDefinitionStoreException {
		Assert.notNull(resources, "Resource array must not be null");
		int count = 0;
		for (Resource resource : resources) {
			//這裏方法重載參數是Resource
			count += loadBeanDefinitions(resource);
		}
		return count;
	}

方法重載
org.springframework.beans.factory.xml.XmlBeanDefinitionReader#loadBeanDefinitions(org.springframework.core.io.Resource)

public int loadBeanDefinitions(Resource resource) throws BeanDefinitionStoreException {
		return loadBeanDefinitions(new EncodedResource(resource));
	}
org.springframework.beans.factory.xml.XmlBeanDefinitionReader#loadBeanDefinitions(org.springframework.core.io.support.EncodedResource) 方法

在這裏插入圖片描述


public int loadBeanDefinitions(EncodedResource encodedResource) throws BeanDefinitionStoreException {
		Assert.notNull(encodedResource, "EncodedResource must not be null");
		if (logger.isTraceEnabled()) {
			logger.trace("Loading XML bean definitions from " + encodedResource);
		}

		Set<EncodedResource> currentResources = this.resourcesCurrentlyBeingLoaded.get();
		if (currentResources == null) {
			currentResources = new HashSet<>(4);
			this.resourcesCurrentlyBeingLoaded.set(currentResources);
		}
		if (!currentResources.add(encodedResource)) {
			throw new BeanDefinitionStoreException(
					"Detected cyclic loading of " + encodedResource + " - check your import definitions!");
		}
		try {
			/**
			 * 將xml文件封裝爲InputStream-》InputSource
			 */
			InputStream inputStream = encodedResource.getResource().getInputStream();
			try {
				//封裝流
				InputSource inputSource = new InputSource(inputStream);
				if (encodedResource.getEncoding() != null) {
					//設置編碼
					inputSource.setEncoding(encodedResource.getEncoding());
				}
				/**
				 * 真正幹活的方法 
				 */
				return doLoadBeanDefinitions(inputSource, encodedResource.getResource());
	.....
	

doLoadBeanDefinitions方法

	protected int doLoadBeanDefinitions(InputSource inputSource, Resource resource)
			throws BeanDefinitionStoreException {

		try {
			/**
			 * 將input轉換爲文檔,讀取XML文件
			 */
			Document doc = doLoadDocument(inputSource, resource);
			/**
			 * 讀取配置的數量
			 */
			int count = registerBeanDefinitions(doc, resource);
			if (logger.isDebugEnabled()) {
				logger.debug("Loaded " + count + " bean definitions from " + resource);
			}
			return count;
		}

registerBeanDefinitions方法註冊

	public int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException {
		/**
		 * 創建BeanDefinitionDocumentReader
		 */
		BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
		/**
		 * 獲取已經有的BeanDefinitionCount數量
		 */
		int countBefore = getRegistry().getBeanDefinitionCount();
		/**
		 * 註冊BeanDefinition,創建Reader上下文
		 */
		documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
		return getRegistry().getBeanDefinitionCount() - countBefore;
	}

doRegisterBeanDefinitions方法

org.springframework.beans.factory.xml.DefaultBeanDefinitionDocumentReader#doRegisterBeanDefinitions

	protected void doRegisterBeanDefinitions(Element root) {
	...
		/**
		 * 前置預處理
		 * 勾子方法 空
		 */
		preProcessXml(root);
		parseBeanDefinitions(root, this.delegate);
		/**
		 * 後置處理
		 * 勾子方法 空
		 */
		postProcessXml(root);
	}
parseBeanDefinitions
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);
		}

parseDefaultElement

	private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
		/**
		 * import元素處理
		 */
		if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
			importBeanDefinitionResource(ele);
		}
		else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
			/**
			 * alias元素處理
			 */
			processAliasRegistration(ele);
		}
		else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
			/**
			 * bean元素處理
			 */
			processBeanDefinition(ele, delegate);
		}
		else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
			/**
			 * 嵌套beans元素處理
			 */
			// recurse
			doRegisterBeanDefinitions(ele);
		}
	
```
####  processBeanDefinition
```java
	protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {
		/**
		 * 封裝BeanDefinitionHolder對象,裏面有一個BeanDefinition對象
		 */
		BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
		if (bdHolder != null) {
			/**
			 * 如果有自定義標籤,處理自定義標籤
			 */
			bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
			try {
				// Register the final decorated instance.
				/**
				 *完成Bean的註冊
				 */
				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));
		}
	}
```

BeanDefinitionReaderUtils.registerBeanDefinition

org.springframework.beans.factory.support.DefaultListableBeanFactory#registerBeanDefinition
```java




		else {
				// Still in startup registration phase
				this.beanDefinitionMap.put(beanName, beanDefinition);
				this.beanDefinitionNames.add(beanName);
				removeManualSingletonName(beanName);
			}
			this.frozenBeanDefinitionNames = null;
		}
```
這裏註冊完成
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200628212345139.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvMDQ5MQ==,size_16,color_FFFFFF,t_70)

![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20200628212406740.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2tvMDQ5MQ==,size_16,color_FFFFFF,t_70)


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章