Spring refresh - finishBeanFactoryInitialization

博文目录


生产 Bean 的流程

遍历 BeanName, 筛选符合条件的走 getBean 流程

refresh 的 finishBeanFactoryInitialization 方法开始生产所有的单例 Bean

  • 遍历 beanDefinitionNames, 拿到对应的 BeanDefinition
  • 逐一判断该 BeanDefinition 是否满足生产条件(非抽象&单例&非懒加载)
  • 判断是不是 FactoryBean
    • 是, 先获取该 FactoryBean 实例 (getBean(&beanName)), 再看是不是需要使用该 FactoryBean 来获取 Bean (getBean(beanName))
    • 否, 获取 Bean (getBean(beanName))

doGetBean 流程

AbstractBeanFactory 的 getBean 方法开始获取某个单例 Bean

  • 调用 doGetBean 方法
  • 先调用 getSingleton 尝试从一级缓存中取 Bean, 有的话直接返回
  • 没有的话, 尝试调用 InstantiationAwareBeanPostProcessor 的 postProcessBeforeInstantiation 方法, 看该 Bean 是否能走短路创建
  • 不行的话, 调用 doCreateBean 走真正的生产 Bean 的流程

deCreateBean 流程

AbstractAutowireCapableBeanFactory 的 doCreateBean 方法开始真正生产 Bean

  • 实例化: 就是通过工厂(@Bean)或反射(无参反射, 有参构造函数反射)等完成 Bean 从无到有的第一步. ObjectBean 是不是在这里生效?
  • 填充属性: Bean 如果有 @Autowired / @Value 注解标注的属性, 则需要做自动填充, 主要由 AutowiredAnnotationBeanPostProcessor 来完成
  • 初始化
    • 调用 BeanNameAware, BeanClassLoaderAware, BeanFactoryAware 的 set 方法
    • 调用所有 BeanPostProcessor 的 postProcessBeforeInitialization 方法
      • 其中有一个 ApplicationContextAwareProcessor, 会调用 EnvironmentAware, EmbeddedValueResolverAware, ResourceLoaderAware, ApplicationEventPublisherAware, MessageSourceAware, ApplicationContextAware 的 set 方法
      • 其中有一个 CommonAnnotationBeanPostProcessor, 会处理 @PostConstruct 注解, 会调用被该注解标注的方法
    • 调用 InitializingBean 的 afterPropertiesSet, 自定义的 init-method 方法
    • 调用所有 BeanPostProcessor 的 postProcessAfterInitialization 方法, AOP 动态代理就是在这里处理的

将 Bean 添加到一级缓存中

将成品 Bean 添加到一级缓存(单例池)中, 从二三级缓存中移除, 然后添加到保存已经处理过的 Bean 的 registeredSingletons 中

详细流程说明

类跳转

  • org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization
    • org.springframework.beans.factory.support.DefaultListableBeanFactory#preInstantiateSingletons
      • org.springframework.beans.factory.support.AbstractBeanFactory#getBean(java.lang.String)
      • org.springframework.beans.factory.support.AbstractBeanFactory#doGetBean
        • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String)
        • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#getSingleton(java.lang.String, org.springframework.beans.factory.ObjectFactory<?>)
          • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBean(java.lang.String, org.springframework.beans.factory.support.RootBeanDefinition, java.lang.Object[])
            • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
            • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#doCreateBean
              • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#createBeanInstance
              • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#populateBean
              • org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory#initializeBean(java.lang.String, java.lang.Object, org.springframework.beans.factory.support.RootBeanDefinition)
        • org.springframework.beans.factory.support.DefaultSingletonBeanRegistry#addSingleton

AbstractApplicationContext#finishBeanFactoryInitialization

protected void finishBeanFactoryInitialization(ConfigurableListableBeanFactory beanFactory) {
	
	// ...

	// Allow for caching all bean definition metadata, not expecting further changes.
	// 冻结所有 BeanDefinition, 将一个标记置为 true, 表示要开始生产 Bean 了
	beanFactory.freezeConfiguration();

	// Instantiate all remaining (non-lazy-init) singletons.
	// 实例化剩余的单例 Bean
	beanFactory.preInstantiateSingletons();
}

DefaultListableBeanFactory#preInstantiateSingletons

  • 拿到所有的 BeanDefinition 的名字来遍历 BeanDefinition
  • 如果这个 BeanDefinition 所代表的 Bean 不是抽象的, 是单例的, 不是懒加载的, 则走流程
    • 如果这个 BeanDefinition 所代表的 Bean 是 FactoryBean, 则判断是否需要提前初始化, 需要的话就走流程 getBean
    • 如果这个 BeanDefinition 所代表的 Bean 不是 FactoryBean, 就走流程 getBean
@Override
public void preInstantiateSingletons() throws BeansException {
	
	// ...

	// Iterate over a copy to allow for init methods which in turn register new bean definitions.
	// While this may not be part of the regular factory bootstrap, it does otherwise work fine.
	// 获取到所有的 BeanDefinition 的名字
	List<String> beanNames = new ArrayList<>(this.beanDefinitionNames);

	// Trigger initialization of all non-lazy singleton beans...
	// 遍历
	for (String beanName : beanNames) {

		// 通过 @Bean, @Component 等拿到的 BeanDefinition 都是不同的类型
		// 把不同类型的 BeanDefinition 都转换为统一的 RootBeanDefinition, 方便后续判断
		RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName);

		// 满足条件的 BeanDefinition 才会被加载
		// 条件: 不是抽象, 是单例, 不是懒加载
		if (!bd.isAbstract() && bd.isSingleton() && !bd.isLazyInit()) {

			// 判断是不是 FactoryBean, FactoryBean 这种 Bean 不是通过反射来实例化, 而是通过调用 getObject 来生产其他的 Bean
			if (isFactoryBean(beanName)) {

				// 通过 &beanName 的方式获取用于生产 Bean 的原始 FactoryBean 本身
				Object bean = getBean(FACTORY_BEAN_PREFIX + beanName);
				if (bean instanceof FactoryBean) {
					FactoryBean<?> factory = (FactoryBean<?>) bean;
					boolean isEagerInit;
					if (System.getSecurityManager() != null && factory instanceof SmartFactoryBean) {
						isEagerInit = AccessController.doPrivileged(
								(PrivilegedAction<Boolean>) ((SmartFactoryBean<?>) factory)::isEagerInit,
								getAccessControlContext());
					}
					else {
						isEagerInit = (factory instanceof SmartFactoryBean &&
								((SmartFactoryBean<?>) factory).isEagerInit());
					}
					if (isEagerInit) {
						getBean(beanName);
					}
				}
			}
			else {

				// 不是 FactoryBean 的话, 就调用 getBean 来生产 Bean
				getBean(beanName);
			}
		}
	}

	// ...
	
}

BeanFactory 和 FactoryBean 的区别

BeanFactory 是 Bean 工厂, FactoryBean 是一种特殊的 Bean, 这种类型的 Bean 不是通过反射来实例化, 而是通过调用其 getObject 方法, 通过编程的方式自行实现实例化

虽然名字很像容易混淆,但是完全2个东西

BeanFactory是Bean的工厂,spring的顶层核心接口,没有BeanFactory就没有Bean的存在,重要程度可想而知

FactoryBean也是一个接口,被他修饰的Bean将成为一个特殊的Bean, 原本的Bean将被隐藏,而是由FactoryBean的getObject返回最终的Bean

AbstractBeanFactory#getBean(String)

public Object getBean(String name) throws BeansException {
	return doGetBean(name, null, null, false);
}

AbstractBeanFactory#doGetBean

protected <T> T doGetBean(String name, @Nullable Class<T> requiredType, @Nullable Object[] args, boolean typeCheckOnly) throws BeansException {

	// 拿到真实的 BeanName, 这里传入的可能是别名或其他的
	String beanName = transformedBeanName(name);
	Object bean;

	// Eagerly check singleton cache for manually registered singletons.
	// 尝试去缓存中获取 Bean, 如果有的话直接返回, 没有的话再去创建
	// 其实就是去一级缓存(单例池,singletonObjects)中找
	Object sharedInstance = getSingleton(beanName);
	
	// ...

	// 缓存中没有该 Bean, 需要走创建流程
	
	// Check if bean definition exists in this factory.
	// 子父容器, 集成了 SpringMvc 后才有
	BeanFactory parentBeanFactory = getParentBeanFactory();
	
	// ...

	RootBeanDefinition mbd = getMergedLocalBeanDefinition(beanName);
	checkMergedBeanDefinition(mbd, beanName, args);

	// Guarantee initialization of beans that the current bean depends on.
	// 处理 dependsOn, 就是某个 Bean 必须在另一个 Bean 之前创建, 如果没有创建, 就先去创建那个 Bean
	String[] dependsOn = mbd.getDependsOn();
	if (dependsOn != null) {
		for (String dep : dependsOn) {
			if (isDependent(beanName, dep)) {
				throw new BeanCreationException(mbd.getResourceDescription(), beanName,
						"Circular depends-on relationship between '" + beanName + "' and '" + dep + "'");
			}
			registerDependentBean(dep, beanName);
			try {

				// 优先去加载生产顺序排在当前 Bean 前面的 Bean
				getBean(dep);
			}
			catch (NoSuchBeanDefinitionException ex) {
				throw new BeanCreationException(mbd.getResourceDescription(), beanName,
						"'" + beanName + "' depends on missing bean '" + dep + "'", ex);
			}
		}
	}

	// Create bean instance.
	if (mbd.isSingleton()) {

		// 这里的 getSingleton 和 上面的 getSingleton 不是同一个方法, 后者是从一级缓存中拿
		// 该方法传入了一段代码, 到合适的时机就会被回调执行
		sharedInstance = getSingleton(beanName, () -> {
			try {

				// 创建 Bean
				// getSingleton 里面调用 singletonFactory.getObject 的时候, 就会回调传入的 createBean 方法
				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;
			}
		});
		bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
	}

	// ...
			
	return (T) bean;
}

DefaultSingletonBeanRegistry#getSingleton

public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
	
	// ..

	// 把当前 BeanName 标记成为正在创建中(通过添加到 singletonsCurrentlyInCreation 这个 Set 里面)
	// 如果因为循环依赖而导致第二次要添加到 Set 中, 则添加将会失败, 貌似是处理循环依赖用的?
	// 这个方法里面, 如果添加 Set 失败的话, 会抛异常, 会不会打断 refresh 的流程
	beforeSingletonCreation(beanName);
	
	// ...

	// 执行传入代码的创建 Bean 的逻辑, 调用 createBean 方法
	singletonObject = singletonFactory.getObject();
	
	// ...
	
	// 将生成的 Bean 加入到缓存中
	// 加入到 一级缓存 和 用来记录保存已经处理过的 Bean 的 registeredSingletons
	// 从二三级缓存中移除
	addSingleton(beanName, singletonObject);

	return singletonObject;
		
}

AbstractAutowireCapableBeanFactory#createBean

protected Object createBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {

	// ...
	
	// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
	// 调用 BeanPostProcessor
	// 这里是第一次调用 BeanPostProcessor
	// 通过调用 BeanPostProcessor 来尝试生成 Bean 对象, 如果这里成功生成 Bean 对象, 则会直接返回, 不会再走常规的创建流程
	// 不管是 cglib 还是 jdk, 通常不会在这里生成代理对象, 因为这里生成 Bean 的话, 还没有走填充的步骤, 不是完整的 Bean, 可能没法正常工作
	// 通常都是在 Bean 创建成功后的后置处理器中生成代理对象
	// 但是在这里会解析 AOP 切面信息进行缓存
	Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
	if (bean != null) {
		return bean;
	}
	
	// ...

	// 走真正的默认创建 Bean 的流程
	// 创建 Bean 的流程是 实例化 - 填充属性 - 初始化
	// Bean 实例化的流程是 BeanDefinition - BeanWrapper - Bean
	Object beanInstance = doCreateBean(beanName, mbdToUse, args);
	if (logger.isTraceEnabled()) {
		logger.trace("Finished creating instance of bean '" + beanName + "'");
	}
	return beanInstance;
	
	// ...
	
}

AbstractAutowireCapableBeanFactory#doCreateBean

protected Object doCreateBean(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) throws BeanCreationException {

	// Instantiate the bean.
	// BeanWrapper, 就是包装了一个 Bean, 提供了一些操作 bean 的方法
	// 提供用于分析和操作标准JavaBean的操作, 获得和设置属性值(单独或批量), 获取属性描述符以及查询属性的可读性的能力
	BeanWrapper instanceWrapper = null;
	if (mbd.isSingleton()) {
		instanceWrapper = this.factoryBeanInstanceCache.remove(beanName);
	}
	if (instanceWrapper == null) {

		// 实例化, 使用合适的方式, Bean 创建的第一步
		// 工厂方法(@Bean, 更灵活, 自己可以控制过程)
		// 反射(无参构造函数(class.newIns...), 有参构造函数(constructor.newIns..., @Autowired 构造器))
		// 方法链太长了, 先不看
		instanceWrapper = createBeanInstance(beanName, mbd, args);
	}
	Object bean = instanceWrapper.getWrappedInstance();
	
	// ...

	// Initialize the bean instance.
	Object exposedObject = bean;

	// 填充属性, Bean 创建的第二步, 调用 setter 方法赋值
	// 方法链太长了, 先不看
	populateBean(beanName, mbd, instanceWrapper);

	// 初始化, Bean 创建的第三步
	exposedObject = initializeBean(beanName, exposedObject, mbd);
	
	// ...

	// 默认单例 Bean 的生产流程走完
	return exposedObject;
}

AbstractAutowireCapableBeanFactory#createBeanInstance

Spring refresh - finishBeanFactoryInitialization - createBeanInstance 实例化

AbstractAutowireCapableBeanFactory#populateBean

Spring refresh - finishBeanFactoryInitialization - populateBean 填充属性

AbstractAutowireCapableBeanFactory#initializeBean(String, Object, RootBeanDefinition)

在这里插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值