其他分享
首页 > 其他分享> > spring单例bean的创建

spring单例bean的创建

作者:互联网

设计

假设我们自己来设计怎么去创建bean,有几种方案可以提供

  1. 每次需要的时候new一个对象(这个也是我们常用的)
  2. 对第一个进行升级,把new对象的工作交给工厂
  3. 假设我们的对象是稳定的,而且是线程安全的,那么我们可以使用同一个对象,可以把这个对象缓存起来。放到一个容器,每次需要用的时候拿出来

spring做的事情就是帮我们创建对象,并且把对象缓存到一个Map容器中,需要的时候从容器获取即可。

上图

在这里插入图片描述

关键的前置条件

在bean创建之前有些工作时必须完成的,它们是创建bean的必要条件

  1. BeanDefinition的收集已经完成(需要创建那些bean)
  2. 工厂初始化完成(容器的准备)
  3. 配置加载完成(bean中属性的注入)
    。。。

步骤

.........省略
// Trigger initialization of all non-lazy singleton beans...
		for (String beanName : beanNames) {
					....
					// getBean就是创建对象操作
					getBean(beanName);
					....
				
			}
		}
.........
protected <T> T doGetBean(
			String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly)
			throws BeansException {

		.........
		// 从缓存中拿取实例
		Object sharedInstance = getSingleton(beanName);
		.........
		// 重点看这里,大部分情况都是单例
			if (mbd.isSingleton()) {
				sharedInstance = getSingleton(beanName, () -> {
					try {
						// 看这里
						return createBean(beanName, mbd, args);
					}
					catch (BeansException ex) {
						// Explicitly remove instance from singleton cache: It might have been put there
						// eagerly by the creation process, to allow for circular reference resolution.
						// Also remove any beans that received a temporary reference to the bean.
						destroySingleton(beanName);
						throw ex;
					}
				});
				// factoryBean 的getObject 方法获取的实例 走这里
				bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
			}
		.........
			
....
// 实例化对象
return ctor.newInstance(argsWithDefaultValues);
...
....
		if (newSingleton) {
			// 放入缓存
			addSingleton(beanName, singletonObject);
		}
		...		

标签:缓存,创建,spring,beanName,创建对象,bean,单例,.........
来源: https://blog.csdn.net/qq_22986265/article/details/120150323