ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

spring单例bean的创建

2021-09-07 09:30:10  阅读:143  来源: 互联网

标签:缓存 创建 spring beanName 创建对象 bean 单例 .........


设计

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

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

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

上图

在这里插入图片描述

关键的前置条件

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

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

步骤

  • 循环所有的beanName,对每个beanName进行创建
.........省略
// 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);
			}
		.........
			
  • 最终使用java的反射api来创建对象
....
// 实例化对象
return ctor.newInstance(argsWithDefaultValues);
...
  • 创建对象完成之后放入缓存
....
		if (newSingleton) {
			// 放入缓存
			addSingleton(beanName, singletonObject);
		}
		...		
  • 上述主要讲了spring对象单例的创建

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有