@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
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
else {
// Still in startup registration phase
this.beanDefinitionMap.put(beanName, beanDefinition);
this.beanDefinitionNames.add(beanName);
removeManualSingletonName(beanName);
}
this.frozenBeanDefinitionNames = null;
}
这里注册完成