obtainFreshBeanFactory();

整体obtainFreshBeanFactory内部实现

protected ConfigurableListableBeanFactory obtainFreshBeanFactory() {
    refreshBeanFactory();
	ConfigurableListableBeanFactory beanFactory = getBeanFactory();
	if (logger.isDebugEnabled()) {
		logger.debug("Bean factory for " + getDisplayName() + ": " + beanFactory);
	}
	return beanFactory;
}

refreshBeanFactory();

// 关闭先前的bean工厂(如果有的话)
// 并为上下文周期的下一阶段初始化一个新的bean工厂
@Override
protected final void refreshBeanFactory() throws BeansException {
	if (hasBeanFactory()) {
	    destroyBeans();
		closeBeanFactory();
	}
	try {
	    DefaultListableBeanFactory beanFactory = createBeanFactory();
		beanFactory.setSerializationId(getId());
		customizeBeanFactory(beanFactory);
		loadBeanDefinitions(beanFactory);
		synchronized (this.beanFactoryMonitor) {
			this.beanFactory = beanFactory;
		}
	}
	catch (IOException ex) {
		throw new ApplicationContextException("I/O error parsing bean "+
		  "definition source for " + getDisplayName(), ex);
	}
}

hasBeanFactory()

// 内部beanFactory的同步监视器
private final Object beanFactoryMonitor = new Object();
// 此 上下文的Bean工厂
private DefaultListableBeanFactory beanFactory;

// 此上下文是否持有一个bean factory
// 即 至少被使用一次且没有被关闭
protected final boolean hasBeanFactory() {
	synchronized (this.beanFactoryMonitor) {
		return (this.beanFactory != null);
	}
}

createBeanFactory();

// 为此上下文创建一个内部 bean 工厂。 每次refresh()尝试时调用。
// 默认实现创建一个DefaultListableBeanFactory ,
// 并将此上下文父级的内部 bean 工厂作为父 bean 工厂。 
// 可以在子类中覆盖,例如自定义 DefaultListableBeanFactory 的设置。
protected DefaultListableBeanFactory createBeanFactory() {
	return new DefaultListableBeanFactory(getInternalParentBeanFactory());
}

new DefaultListableBeanFactory(getInternalParentBeanFactory());

// 使用给定的父级创建一个新的 AbstractAutowireCapableBeanFactory。
public AbstractAutowireCapableBeanFactory(BeanFactory parentBeanFactory) {
	this();
	setParentBeanFactory(parentBeanFactory);
}

getInternalParentBeanFactory());的内部实现如下:

// 如果实现了 ConfigurableApplicationContext,则返回父上下文的内部 bean 工厂;
//  否则,返回父上下文本身。
protected BeanFactory getInternalParentBeanFactory() {
  return (getParent() instanceof ConfigurableApplicationContext) ?
    ((ConfigurableApplicationContext) getParent()).getBeanFactory() : getParent();
}

getParent();的内部实现如下:

// Parent context
private ApplicationContext parent;

// 返回父上下文,如果没有父上下文(即此上下文是上下文层次结构的根),
// 则返回null 。
@Override
public ApplicationContext getParent() {
	return this.parent;
}
this();
public AbstractAutowireCapableBeanFactory() {
	super();
	ignoreDependencyInterface(BeanNameAware.class);
	ignoreDependencyInterface(BeanFactoryAware.class);
	ignoreDependencyInterface(BeanClassLoaderAware.class);
}
super();
public AbstractBeanFactory() { }
ignoreDependencyInterface(Class<?> ifc);
// 依赖接口忽略依赖检查和自动装配,默认情况下,仅忽略BeanFactory接口
private final Set<Class<?>> ignoreDependencyInterfaces = 
  new HashSet<Class<?>>();
public void ignoreDependencyInterface(Class<?> ifc) {
    this.ignoredDependencyInterfaces.add(ifc);
}
setParentBeanFactory(parentBeanFactory);
// Parent bean factory, for bean inheritance support.
private BeanFactory parentBeanFactory;

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

beanFactory.setSerializationId(getId());

getId();的具体实现如下:

// 此上下文的唯一id
private String id = ObjectUtils.identityToString(this);

// 返回此应用程序上下文的唯一id
// 如果没有,则返回null
@Override
public String getId() {
	return this.id;
}

setSerializationId(getId());的具体实现如下:

// Map from serialized id to factory instance
private static final 
   Map<String, Reference<DefaultListableBeanFactory>> serializableFactories =
	  new ConcurrentHashMap<String, Reference<DefaultListableBeanFactory>>(8);
	  
// Optional id for this factory, 
// for serialization purposes
private String serializationId;

public void setSerializationId(String serializationId) {
	if (serializationId != null) {
		serializableFactories.put(serializationId,
		   new WeakReference<DefaultListableBeanFactory>(this));
	}
	else if (this.serializationId != null) {
		serializableFactories.remove(this.serializationId);
	}
	this.serializationId = serializationId;
}

customizeBeanFactory(beanFactory);

private Boolean allowBeanDefinitionOverriding;

private Boolean allowCircularReferences;

// 自定义此上下文使用的内部bean工厂,每次refresh时调用
protected void customizeBeanFactory(DefaultListableBeanFactory beanFactory) {
	if (this.allowBeanDefinitionOverriding != null) {
	  // 设置是否允许通过注册具有相同名称的不同定义来覆盖 bean 定义,
	  // 自动替换前者。 如果没有,将抛出异常。 这也适用于覆盖别名。
      // Default is "true".
	  beanFactory.setAllowBeanDefinitionOverriding(this.allowBeanDefinitionOverriding);
	}
	if (this.allowCircularReferences != null) {
	  // 设置是否允许 bean 之间的循环引用 - 并自动尝试解决它们。
      // 请注意,循环引用解析意味着所涉及的 bean 之一将收到对尚未完全初始化
      // 的另一个 bean 的引用。 这可能会导致对初始化的微妙和不那么微妙的副作用;
      // 不过,它确实适用于许多场景。
      // Default is "true". 关闭此选项以在遇到循环引用时抛出异常,完全禁止它们。 
      // 注意:通常建议不要依赖 bean 之间的循环引用。 重构您的应用程序逻辑,
      // 让所涉及的两个 bean 委托给封装其公共逻辑的第三个 bean	      
      beanFactory.setAllowCircularReferences(this.allowCircularReferences);
	}
}

loadBeanDefinitions(beanFactory);

// 通过 XmlBeanDefinitionReader 加载 bean 定义。
@Override
protected void loadBeanDefinitions(DefaultListableBeanFactory beanFactory)
 throws BeansException, IOException 
{
	// 对于给定的beanFactory创建一个beanDefinitionReader
	XmlBeanDefinitionReader beanDefinitionReader = 
	    new XmlBeanDefinitionReader(beanFactory);

	// 使用此上下文的配置 bean 定义阅读器资源加载环境。
	beanDefinitionReader.setEnvironment(this.getEnvironment());
	beanDefinitionReader.setResourceLoader(this);
	beanDefinitionReader.setEntityResolver(new ResourceEntityResolver(this));

	// 允许子类提供阅读器的自定义初始化,
    // 然后继续实际加载 bean 定义。	
    initBeanDefinitionReader(beanDefinitionReader);
	loadBeanDefinitions(beanDefinitionReader);
}

initBeanDefinitionReader(beanDefinitionReader);

// 初始化用于加载此上下文的 bean 定义的 bean 定义读取器。
// 默认实现为空。
// 可以在子类中覆盖,例如关闭 XML 验证或使用不同的 XmlBeanDefinitionParser 实现。
protected void initBeanDefinitionReader(XmlBeanDefinitionReader reader) {
	reader.setValidating(this.validating);
}

loadBeanDefinitions(beanDefinitionReader);

// 使用给定的 XmlBeanDefinitionReader 加载 bean 定义。
// bean 工厂的生命周期由refreshBeanFactory方法处理; 
// 因此,此方法仅用于加载和/或注册 bean 定义。
protected void loadBeanDefinitions(XmlBeanDefinitionReader reader)
  throws BeansException, IOException
{
	Resource[] configResources = getConfigResources();
	if (configResources != null) {
		reader.loadBeanDefinitions(configResources);
	}
	String[] configLocations = getConfigLocations();
	if (configLocations != null) {
		reader.loadBeanDefinitions(configLocations);
	}
}

getBeanFactory();

// 内部beanFactory的同步监视器
private final Object beanFactoryMonitor = new Object();
// 此上下文的beanFactory
private DefaultListableBeanFactory beanFactory;

// 子类必须在此处返回其内部 bean 工厂。 他们应该有效地实现查找,
// 以便可以重复调用它而不会影响性能。
// 注意:子类在返回内部 bean 工厂之前应该检查上下文是否仍然处于活动状态。 
// 一旦上下文关闭,内部工厂通常应被视为不可用。
@Override
public final ConfigurableListableBeanFactory getBeanFactory() {
	synchronized (this.beanFactoryMonitor) {
		if (this.beanFactory == null) {
			throw new IllegalStateException(
			  "BeanFactory not initialized or already closed - " +
				"call 'refresh' before accessing beans via the ApplicationContext");
		}
		return this.beanFactory;
	}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值