@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)