Spring IOC ( 一 ) : DefaultSingletonBeanRegistry源码分析


这是DefaultSingletonBeanRegistry类的体系结构,由一个类一个责任的原则


  • AliasRegistry : 提供别名注册的接口
  • SingletonBeanRegistry :  提供单例bean注册的接口
  • ObjectFactory : 这个接口通常用于封装一个通用的工厂,它只有一个方法getObject() ,它调用getObject()方法返回一个新的实例,一些在每次调用的目标对象(原型).
  • DisposableBean : 接口实现为beans要破坏释放资源。它也只有一个方法destroy(),由一个破坏一个singleton的BeanFactory调用。
  • SimpleAliasRegistry: 它简单地实现了AliasRegistry接口。
  • DefaultSingletonBeanRegistry:它继承SimpleAliasRegistry类和实现了SingletonBeanRegistry接口,因此这个类可以有别名注册的功能和单例bean注册的功能,并且他还支持注册DisposableBean实例;它依赖ObjectFactory接口和DisposableBean接口(关闭注册表时调用到了destroy方法)。

/**
 * 共享bean实例的通用注册表,实现了SingletonBeanRegistry. 允许注册表中注册的单例应该被所有调用者共享,通过bean名称获得。
 * 
 * 还支持登记的DisposableBean实例,(这可能会或不能正确的注册单例),关闭注册表时destroyed.
 * 可以注册bean之间的依赖关系,执行适当的关闭顺序。
 * 
 * 
 * 这个类主要用作基类的BeanFactory实现, 提供基本的管理
 * singleton bean 实例功能。
 * 
 */
public class DefaultSingletonBeanRegistry extends SimpleAliasRegistry implements
		SingletonBeanRegistry {

//内部标记为一个空的单例对象: 并发 Maps( 不支持空值 )作为标志值。
	protected static final Object NULL_OBJECT = new Object();

// 日记用来记录子类
	protected final Log logger = LogFactory.getLog(getClass());

//是存放singleton对象的缓存
	private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>();

// 是存放制造singleton的工厂对象的缓存
	private final Map<String, ObjectFactory> singletonFactories = new HashMap<String, ObjectFactory>();

//是存放singletonFactory 制造出来的 singleton 的缓存
	private final Map<String, Object> earlySingletonObjects = new HashMap<String, Object>();
//以上三个缓存是这个类存放单例bean的主要Map
//就是单例注册表
	private final Set<String> registeredSingletons = new LinkedHashSet<String>(
			16);

//目前正在创建中的单例bean的名称的集合
	private final Set<String> singletonsCurrentlyInCreation = Collections
			.synchronizedSet(new HashSet<String>());

//存放异常出现的相关的原因的集合
	private Set<Exception> suppressedExceptions;

//标志,指示我们目前是否在销毁单例中
	private boolean singletonsCurrentlyInDestruction = false;

//存放一次性bean的缓存
	private final Map<String, Object> disposableBeans = new LinkedHashMap<String, Object>();

//外部bean与被包含在外部bean的所有内部bean集合包含关系的缓存
	private final Map<String, Set<String>> containedBeanMap = new ConcurrentHashMap<String, Set<String>>();

//指定bean与依赖指定bean的所有bean的依赖关系的缓存
	private final Map<String, Set<String>> dependentBeanMap = new ConcurrentHashMap<String, Set<String>>();

//指定bean与创建这个bean所需要依赖的所有bean的依赖关系的缓存
	private final Map<String, Set<String>> dependenciesForBeanMap = new ConcurrentHashMap<String, Set<String>>();

	// SingletonBeanRegistry接口的registerSingleton方法的实现
	public void registerSingleton(String beanName, Object singletonObject)
			throws IllegalStateException {
		Assert.notNull(beanName, "'beanName' must not be null");
		synchronized (this.singletonObjects) {
			Object oldObject = this.singletonObjects.get(beanName);
//如果singletonObjects缓存找到有指定名称为beanName的对象,则表示该名称已被占用
			if (oldObject != null) {
				throw new IllegalStateException("Could not register object ["
						+ singletonObject + "] under bean name '" + beanName
						+ "': there is already object [" + oldObject
						+ "] bound");
			}
//若该名称没被占用,真正的注册操作在这里实现
			addSingleton(beanName, singletonObject);
		}
	}

	
	protected void addSingleton(String beanName, Object singletonObject) {
		synchronized (this.singletonObjects) {
			// 因为singletonObjects类型是ConcurrentHashMap,并发Map不支持空值作为标志值,所以用NULL_OBJECT来代替
			this.singletonObjects.put(beanName,
					(singletonObject != null ? singletonObject : NULL_OBJECT));
			// beanName已被注册存放在singletonObjects缓存,那么singletonFactories不应该再持有名称为beanName的工厂
			this.singletonFactories.remove(beanName);
			// beanName已被注册存放在singletonObjects缓存,那么earlySingletonObjects不应该再持有名称为beanName的bean。
			this.earlySingletonObjects.remove(beanName);
			// beanName放进单例注册表中
			this.registeredSingletons.add(beanName);
		}
	}

	/**
	 * 添加 名称为beanName的singletonFactory对象
	 * 
	 */
	protected void addSingletonFactory(String beanName,
			ObjectFactory singletonFactory) {
		Assert.notNull(singletonFactory, "Singleton factory must not be null");
		synchronized (this.singletonObjects) {
			// 判断singletonObjects内名字为beanName是否被占用,若没有,进行注册操作
			if (!this.singletonObjects.containsKey(beanName)) {
				this.singletonFactories.put(beanName, singletonFactory);
				this.earlySingletonObjects.remove(beanName);
				this.registeredSingletons.add(beanName);
			}
		}
	}

	// SingletonBeanRegistry接口的getSingleton方法的实现
	public Object getSingleton(String beanName) {
		return getSingleton(beanName, true);
	}


	protected Object getSingleton(String beanName, boolean allowEarlyReference) {
		Object singletonObject = this.singletonObjects.get(beanName);
		// 如果singletonObjects指定beanName的对象是不存在的
		if (singletonObject == null) {
			synchronized (this.singletonObjects) {
				singletonObject = this.earlySingletonObjects.get(beanName);
				// 如果earlySingletonObjects指定的beanName的对象是不存在的且allowEarlyReference是允许的
				if (singletonObject == null && allowEarlyReference) {
					ObjectFactory singletonFactory = this.singletonFactories
							.get(beanName);
					// 如果存在指定beanName的singletonFactory对象
					if (singletonFactory != null) {
						// singletonFactory创建指定的单例对象
						singletonObject = singletonFactory.getObject();
						// 这里可以看出earlySingletonObjects缓存应该是存放singletonFactory产生的singleton
						this.earlySingletonObjects.put(beanName,
								singletonObject);
						// 这里表示指定的beanName已被占用,所以要在singletonFactories移除该名称
						this.singletonFactories.remove(beanName);
					}
				}
			}
		}
		return (singletonObject != NULL_OBJECT ? singletonObject : null);
	}


	public Object getSingleton(String beanName, ObjectFactory singletonFactory) {
		Assert.notNull(beanName, "'beanName' must not be null");
		synchronized (this.singletonObjects) {
			Object singletonObject = this.singletonObjects.get(beanName);
			// 如果singetonObjects缓存不存在名称为beanName的对象
			if (singletonObject == null) {
				// 如果目前在销毁singellton
				if (this.singletonsCurrentlyInDestruction) {
					throw new BeanCreationNotAllowedException(
							beanName,
							"Singleton bean creation not allowed while the singletons of this factory are in destruction "
									+ "(Do not request a bean from a BeanFactory in a destroy method implementation!)");
				}
				if (logger.isDebugEnabled()) {
					logger.debug("Creating shared instance of singleton bean '"
							+ beanName + "'");
				}
				// 单例对象创建前的回调,默认实现注册正在创建的单例
				beforeSingletonCreation(beanName);
				// 判断存储异常相关原因的集合是否已存在
				boolean recordSuppressedExceptions = (this.suppressedExceptions == null);
				// 若没有,刚创建异常集合的实例
				if (recordSuppressedExceptions) {
					this.suppressedExceptions = new LinkedHashSet<Exception>();
				}
				try {
					// 由参数给定的singletonFactory创建singleton对象,getObject方法的具体实现由ObjectFactory的子类决定
					singletonObject = singletonFactory.getObject();
				} catch (BeanCreationException ex) {
					// 如果异常被抓取,在这里将出现异常的原因抛出
					if (recordSuppressedExceptions) {
						for (Exception suppressedException : this.suppressedExceptions) {
							ex.addRelatedCause(suppressedException);
						}
					}
					throw ex;
				} finally {
					// 结束前,将异常集合销毁掉
					if (recordSuppressedExceptions) {
						this.suppressedExceptions = null;
					}
					// 单例创建之后的回调,默认的实现标志单例不要在创建了。
					afterSingletonCreation(beanName);
				}
				// 注册创建后的单例
				addSingleton(beanName, singletonObject);
			}
			return (singletonObject != NULL_OBJECT ? singletonObject : null);
		}
	}

	/**
	 * 注册 发生在singeton bean 实例创建之间发生的异常 
	 */
	protected void onSuppressedException(Exception ex) {
		synchronized (this.singletonObjects) {
			if (this.suppressedExceptions != null) {
				this.suppressedExceptions.add(ex);
			}
		}
	}

	/**
	 * 移除名称为beanName的单例,主要在四个集合中移除,
	 * 如singletonObjects,singletonFactories,earlySingletonObjects
	 * ,registeredSingletons
	 * 
	 */
	protected void removeSingleton(String beanName) {
		synchronized (this.singletonObjects) {
			this.singletonObjects.remove(beanName);
			this.singletonFactories.remove(beanName);
			this.earlySingletonObjects.remove(beanName);
			this.registeredSingletons.remove(beanName);
		}
	}

	// singletonBeanRegistry接口的containsSingleton方法实现
	public boolean containsSingleton(String beanName) {
		return (this.singletonObjects.containsKey(beanName));
	}

	// singletonBeanRegistry接口的getSingletonNames方法实现
	public String[] getSingletonNames() {
		// 对singletonObjects加锁,可能是为了防止registeredSingletons和singletonObjects出现不一致的问题
		synchronized (this.singletonObjects) {
			return StringUtils.toStringArray(this.registeredSingletons);
		}
	}

	// singletonBeanRegistry接口的getSingletonCount方法实现
	public int getSingletonCount() {
		synchronized (this.singletonObjects) {
			return this.registeredSingletons.size();
		}
	}

	/**
	 * 单例对象创建前的回调,默认实现singletonsCurrentlyInCreation集合注册正在创建的单例.
	 * 
	 */
	protected void beforeSingletonCreation(String beanName) {
		if (!this.singletonsCurrentlyInCreation.add(beanName)) {
			throw new BeanCurrentlyInCreationException(beanName);
		}
	}

	/**
	 * 单例创建之后的回调,默认实现singletonCurrentlyInCreation集合移除正在创建的单例
	 * 
	 */
	protected void afterSingletonCreation(String beanName) {
		if (!this.singletonsCurrentlyInCreation.remove(beanName)) {
			throw new IllegalStateException("Singleton '" + beanName
					+ "' isn't currently in creation");
		}
	}

	/**
	 * 返回 存放正在创建单例的集合是否包含指定名称为beanName的单例存在
	 * 
	 */
	public final boolean isSingletonCurrentlyInCreation(String beanName) {
		return this.singletonsCurrentlyInCreation.contains(beanName);
	}

	/**
	 * 一次性bean注册,存放在disponsableBeans集合中
	 * 
	 */
	public void registerDisposableBean(String beanName, DisposableBean bean) {
		synchronized (this.disposableBeans) {
			this.disposableBeans.put(beanName, bean);
		}
	}

	/**
	 * 注册两个bean之间的控制关系,例如内部bean和包含其的外部bean之间
	 * 
	 */
	public void registerContainedBean(String containedBeanName,
			String containingBeanName) {
		synchronized (this.containedBeanMap) {
			// 从containedBeanMap缓存中查找外部bean名为containingBeanName的内部bean集合
			Set<String> containedBeans = this.containedBeanMap
					.get(containingBeanName);
			// 如果没有,刚新建一个存放内部bean的集合,并且存放在containedBeanMap缓存中
			if (containedBeans == null) {
				containedBeans = new LinkedHashSet<String>(8);
				this.containedBeanMap.put(containingBeanName, containedBeans);
			}
			// 将名为containedBeanName的内部bean存放到内部bean集合
			containedBeans.add(containedBeanName);
		}
		// 紧接着调用注册内部bean和外部bean的依赖关系的方法
		registerDependentBean(containedBeanName, containingBeanName);
	}

	/**
	 * 注册给定bean的一个依赖bean,给定的bean销毁之前被销毁。
	 * 
	 */
	public void registerDependentBean(String beanName, String dependentBeanName) {
		// 调用SimpleAliasRegistry的canonicalName方法,这方法是将参数beanName当做别名寻找到注册名,并依此递归
		String canonicalName = canonicalName(beanName);
		synchronized (this.dependentBeanMap) {
			// 从dependentBeanMap缓存中找到依赖名为canonicalName这个bean的 依赖bean集合
			Set<String> dependentBeans = this.dependentBeanMap
					.get(canonicalName);
			// 如果为空,则新建一个依赖bean集合,并且存放到dependentBeanMap缓存中
			if (dependentBeans == null) {
				dependentBeans = new LinkedHashSet<String>(8);
				this.dependentBeanMap.put(canonicalName, dependentBeans);
			}
			// 依赖bean集合添加参数2指定的dependentBeanName
			dependentBeans.add(dependentBeanName);
		}
		synchronized (this.dependenciesForBeanMap) {
			// 从dependenciesForBeanMap缓存中找到dependentBeanName要依赖的所有bean集合
			Set<String> dependenciesForBean = this.dependenciesForBeanMap
					.get(dependentBeanName);
			if (dependenciesForBean == null) {
				dependenciesForBean = new LinkedHashSet<String>(8);
				this.dependenciesForBeanMap.put(dependentBeanName,
						dependenciesForBean);
			}
			dependenciesForBean.add(canonicalName);
		}
	}

	/**
	 *  确定是否还存在名为beanName的被依赖关系
	 */
	protected boolean hasDependentBean(String beanName) {
		return this.dependentBeanMap.containsKey(beanName);
	}

	/**
	 * 返回依赖于指定的bean的所有bean的名称,如果有的话。
	 * 
	 */
	public String[] getDependentBeans(String beanName) {
		Set<String> dependentBeans = this.dependentBeanMap.get(beanName);
		if (dependentBeans == null) {
			return new String[0];
		}
		return StringUtils.toStringArray(dependentBeans);
	}

	/**
	 * 返回指定的bean依赖于所有的bean的名称,如果有的话。
	 * 
	 */
	public String[] getDependenciesForBean(String beanName) {
		Set<String> dependenciesForBean = this.dependenciesForBeanMap
				.get(beanName);
		// 如果没有的话返回new String[0]而不是null
		if (dependenciesForBean == null) {
			return new String[0];
		}
		return dependenciesForBean.toArray(new String[dependenciesForBean
				.size()]);
	}

	// 销毁单例
	public void destroySingletons() {
		if (logger.isInfoEnabled()) {
			logger.info("Destroying singletons in " + this);
		}
		// 单例目前销毁标志开始
		synchronized (this.singletonObjects) {
			this.singletonsCurrentlyInDestruction = true;
		}

		// 销毁disponsableBeans缓存中所有单例bean
		synchronized (this.disposableBeans) {
			String[] disposableBeanNames = StringUtils
					.toStringArray(this.disposableBeans.keySet());
			for (int i = disposableBeanNames.length - 1; i >= 0; i--) {
				destroySingleton(disposableBeanNames[i]);
			}
		}

		// containedBeanMap缓存清空,dependentBeanMap缓存清空,dependenciesForBeanMap缓存清空
		this.containedBeanMap.clear();
		this.dependentBeanMap.clear();
		this.dependenciesForBeanMap.clear();

		// singeltonObjects缓存清空,singletonFactories缓存清空,earlySingletonObjects缓存清空,registeredSingletons缓存清空
		synchronized (this.singletonObjects) {
			this.singletonObjects.clear();
			this.singletonFactories.clear();
			this.earlySingletonObjects.clear();
			this.registeredSingletons.clear();
			// 单例目前正在销毁标志为结束
			this.singletonsCurrentlyInDestruction = false;
		}
	}


	public void destroySingleton(String beanName) {
		// Remove a registered singleton of the given name, if any.
		removeSingleton(beanName);

		// Destroy the corresponding DisposableBean instance.
		DisposableBean disposableBean;
		synchronized (this.disposableBeans) {
			disposableBean = (DisposableBean) this.disposableBeans
					.remove(beanName);
		}
		destroyBean(beanName, disposableBean);
	}


	protected void destroyBean(String beanName, DisposableBean bean) {
		// Trigger destruction of dependent beans first...
		// 这段代码告诉我们先移除要销毁依赖bean
		Set<String> dependencies = this.dependentBeanMap.remove(beanName);
		if (dependencies != null) {
			if (logger.isDebugEnabled()) {
				logger.debug("Retrieved dependent beans for bean '" + beanName
						+ "': " + dependencies);
			}
			for (String dependentBeanName : dependencies) {
				destroySingleton(dependentBeanName);
			}
		}

		// Actually destroy the bean now...
		// 销毁bean实例
		if (bean != null) {
			try {
				bean.destroy();
			} catch (Throwable ex) {
				logger.error("Destroy method on bean with name '" + beanName
						+ "' threw an exception", ex);
			}
		}

		// Trigger destruction of contained beans...
		// 从containedBeanMap缓存中移除要销毁的bean,递归移除它的包含内部bean集合
		Set<String> containedBeans = this.containedBeanMap.remove(beanName);
		if (containedBeans != null) {
			for (String containedBeanName : containedBeans) {
				destroySingleton(containedBeanName);
			}
		}

		// Remove destroyed bean from other beans' dependencies.
		// 从其它bean的依赖bean集合中移除要销毁的bean
		synchronized (this.dependentBeanMap) {
			for (Iterator<Map.Entry<String, Set<String>>> it = this.dependentBeanMap
					.entrySet().iterator(); it.hasNext();) {
				Map.Entry<String, Set<String>> entry = it.next();
				Set<String> dependenciesToClean = entry.getValue();
				dependenciesToClean.remove(beanName);
				if (dependenciesToClean.isEmpty()) {
					it.remove();
				}
			}
		}

		// Remove destroyed bean's prepared dependency information.
		// 最后 从dependenciesForBeanMap缓存中移除要销毁的bean
		this.dependenciesForBeanMap.remove(beanName);
	}

	/**
	 * Expose the singleton mutex to subclasses.
	 * <p>
	 * Subclasses should synchronize on the given Object if they perform any
	 * sort of extended singleton creation phase. In particular, subclasses
	 * should <i>not</i> have their own mutexes involved in singleton creation,
	 * to avoid the potential for deadlocks in lazy-init situations.
	 */
	protected final Object getSingletonMutex() {
		return this.singletonObjects;
	}

}
 

 

<think>好的,我现在需要帮助用户理解Spring IOC容器的源码实现和工作原理。用户之前已经提供了些相关的引用内容,我需要结合这些内容来组织个清晰且详细的回答。 首先,我应该先回顾用户提供的引用,找出关键点。引用1提到BeanFactory和ApplicationContext是两个核心接口,需要分析它们的源码差异。引用2提到了IoC容器的基本概念、关键接口、bean的生命周期和循环依赖的解决方法。引用3提到了事件发布器和监听器的初始化,这部分涉及观察者模式。引用4是关于prepareRefresh方法的预处理步骤,包括初始化属性和早期事件处理。引用5提到了Bean工厂后置处理器和Bean实例化的完成。 接下来,我需要确定回答的结构。通常,源码分析可以从容器启动流程、Bean生命周期管理、核心接口差异、设计模式应用等方面展开。用户的问题比较广泛,所以需要覆盖主要部分,同时保持结构清晰。 第步,容器启动流程。根据引用4中的prepareRefresh方法,这是刷新前的预处理步骤,包括设置启动时间、状态,初始化属性,验证环境变量,保存早期事件。然后,引用5中的invokeBeanFactoryPostProcessors和finishBeanFactoryInitialization是后续步骤,处理Bean工厂后置处理器和实例化Bean。需要详细说明这些步骤的顺序和作用。 第二步,Bean的生命周期管理。这里需要结合BeanFactory和ApplicationContext的区别,可能涉及Bean的创建、初始化、依赖注入、销毁等阶段。引用2中提到bean的生命周期是个重点,可能需要详细描述每个阶段涉及的接口和方法,比如BeanPostProcessor。 第三步,关键接口分析。BeanFactory作为基础接口,而ApplicationContext扩展了更多功能,如事件发布、国际化等。引用1和引用2都提到了这两个接口,需要比较它们的源码和功能差异,比如ApplicationContext如何继承BeanFactory并添加额外特性。 第四部分,设计模式的应用。例如,观察者模式在事件处理中的应用,如引用3中的事件发布器和监听器的初始化。可能还有工厂模式在Bean创建中的使用,单例模式在Bean作用域中的应用等。 第五部分,解决循环依赖。引用2提到循环依赖是高级特性,需要解释Spring如何通过三级缓存解决这个问题,可能涉及源码中的DefaultSingletonBeanRegistry类中的getSingleton方法及相关处理。 在组织内容时,要确保每个部分都有对应的源码引用和解释,例如在容器启动流程中,可以引用prepareRefresh的代码片段,说明其作用。同时,结合用户提供的引用,正确标注引用标识,如[^4]、[^5]等。 另外,用户可能需要示例代码或流程图来辅助理解,但根据问题描述,用户要求的是文本回答,所以需要用清晰的步骤和子标题来划分内容。比如使用“1. 容器启动流程”、“2. Bean生命周期管理”等。 最后,生成相关问题,可能需要围绕源码分析、设计模式、具体实现细节等方面提问,例如询问BeanFactory和ApplicationContext的区别,或者如何扩展BeanPostProcessor接口。 需要确保回答符合用户的要求:结构清晰,分步骤解释,引用正确,并且使用中文。同时,避免使用Markdown格式,但根据用户提供的示例,可能需要使用代码块来展示源码片段,如引用4中的prepareRefresh方法代码。 现在需要整合这些思路,形成个连贯的回答,涵盖用户提到的所有关键点,并正确引用提供的参考文献。</think>### Spring IOC 源码分析及详细解读 #### 、容器启动流程 Spring IOC 容器的启动流程围绕 `ApplicationContext` 的 `refresh()` 方法展开,核心步骤如下: 1. **预处理阶段 (`prepareRefresh()`)** - 记录启动时间,设置容器状态为激活。 - 初始化环境变量和配置参数(如 `initPropertySources()`)。 - 验证必要属性是否合法(如 `validateRequiredProperties()`)。 - 准备早期事件存储队列 `earlyApplicationEvents` [^4]。 2. **加载Bean定义 (`obtainFreshBeanFactory()`)** - 创建 `BeanFactory`(默认实现为 `DefaultListableBeanFactory`)。 - 解析 XML 或注解配置,将 Bean 定义注册到 `BeanDefinitionMap` 中。 3. **处理后置处理器 (`invokeBeanFactoryPostProcessors()`)** - 调用 `BeanFactoryPostProcessor` 实现类(如 `ConfigurationClassPostProcessor`),完成配置类解析、`@Bean` 方法解析等[^5]。 4. **初始化事件和监听器** - 通过 `initApplicationEventMulticaster()` 初始化事件广播器。 - 通过 `registerListeners()` 注册监听器,支持观察者模式[^3]。 5. **实例化单例Bean (`finishBeanFactoryInitialization()`)** - 遍历 `BeanDefinitionMap`,对非懒加载的单例 Bean 进行实例化、依赖注入和初始化[^5]。 --- #### 二、Bean生命周期管理 Bean 的生命周期由以下接口控制: ```java // 示例代码:Bean生命周期关键接口 public interface BeanPostProcessor { Object postProcessBeforeInitialization(Object bean, String beanName); Object postProcessAfterInitialization(Object bean, String beanName); } ``` 1. **实例化**:通过反射调用构造函数。 2. **属性注入**:通过 `populateBean()` 方法注入依赖(如 `@Autowired`)。 3. **初始化**: - 调用 `InitializingBean.afterPropertiesSet()`。 - 执行自定义初始化方法(如 `@PostConstruct`)。 4. **销毁**:容器关闭时调用 `DisposableBean.destroy()` 或自定义销毁方法。 --- #### 三、核心接口对比:BeanFactory vs ApplicationContext | 特性 | BeanFactory | ApplicationContext | |---------------------|---------------------------|----------------------------------------| | Bean实例化 | 延迟加载 | 支持预加载(通过 `refresh()` 触发) | | 国际化支持 | 无 | 有(`MessageSource`) | | 事件发布 | 无 | 有(`ApplicationEventPublisher`) | | AOP集成 | 需手动配置 | 自动集成 | | 资源访问 | 基础支持 | 扩展支持(如 `ResourceLoader`) | ApplicationContext 通过组合模式扩展了 BeanFactory 的功能[^1]。 --- #### 四、设计模式应用 1. **工厂模式**:`BeanFactory` 是工厂接口,`DefaultListableBeanFactory` 是具体实现。 2. **观察者模式**:事件广播器 (`ApplicationEventMulticaster`) 和监听器 (`ApplicationListener`) 实现解耦[^3]。 3. **模板方法模式**:`AbstractApplicationContext.refresh()` 定义了容器刷新的步骤骨架。 --- #### 五、循环依赖解决 Spring 通过**三级缓存**解决循环依赖: 1. **级缓存** (`singletonObjects`):存放完全初始化的 Bean。 2. **二级缓存** (`earlySingletonObjects`):存放未完成属性注入的早期 Bean 引用。 3. **三级缓存** (`singletonFactories`):存放 Bean 工厂对象,用于生成早期代理对象。 源码关键方法: ```java // DefaultSingletonBeanRegistry 类 protected Object getSingleton(String beanName, boolean allowEarlyReference) { Object singletonObject = this.singletonObjects.get(beanName); if (singletonObject == null && isSingletonCurrentlyInCreation(beanName)) { synchronized (this.singletonObjects) { singletonObject = this.earlySingletonObjects.get(beanName); if (singletonObject == null && allowEarlyReference) { ObjectFactory<?> singletonFactory = this.singletonFactories.get(beanName); if (singletonFactory != null) { singletonObject = singletonFactory.getObject(); this.earlySingletonObjects.put(beanName, singletonObject); this.singletonFactories.remove(beanName); } } } } return singletonObject; } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值