Spring启动流程源码之invokeBeanFactoryPostProcessors

invokeBeanFactoryPostProcessors是Spring启动中一个十分重要的方法,在解析这个方法的源码之前首先我们需要先了解几个概念。

一、BeanDefinition

1.1、普通对象的实例化

我们知道普通的java文件在java运行时会先编译成.class的文件加载到jvm内存中,当我们使用的时候通过new去实例化获取到一个对象,具体如下:

1.2、Spring中bean的实例化

在Spring中实例化一个对象和普通的java文件还是有所不同的,他引入了一个BeanDefinition对象,BeanDefinition是一个接口,他的主要作用是去描述java对象的一些信息的,包括是否是单例、java对象中的方法、属性等等,可以看作是另一个.class对象。BeanDefinition的继承关系图如下:

从图上我们可以得知BeanDefinition的主要由一下几种实现:

  1. GenericBeanDefinition : 通用的bean实现,自2.5以后新加入的bean文件配置属性定义类,是ChildBeanDefinition和RootBeanDefinition更好的替代者;
  2. ​ScannedGenericBeanDefinition : 被包扫描到的bean定义;
  3. ​AnnotatedGenericBeanDefinition : 查找类注解初始化的定义;
  4. RootBeanDefinition : 代表一个从配置源(XML,Java Config等)中生成的BeanDefinition
  5. ChildBeanDefinition : 可以从父BeanDefinition中集成构造方法,属性等。

 Spring的实例化过程可以参考下图:

具体的流程和源码解析可以看我的另一篇文章【Spring】Spring中的三级缓存及循环依赖的问题

这里就不在详细对比和赘述了。 

二、invokeBeanFactoryPostProcessors

invokeBeanFactoryPostProcessors的源码在org.springframework.context.support.AbstractApplicationContext#invokeBeanFactoryPostProcessors里,解合我们之前提到的关于BeanDefinition的概念,具体解析如下:

protected void invokeBeanFactoryPostProcessors(ConfigurableListableBeanFactory beanFactory{
		/**
		 * 此处通过反射调用了BeanFctory后置处理器
		 * 调用循序为:1.bean定义注册后置处理器,2.bean工厂后置处理器
		 * 也会调用getBean、doGetBean、createBean、doCreateBean等创建bean的过程
         * 注意:getBeanFactoryPostProcessors是初始化对象,里面没有内容
		 */
		PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());  // ===>
		
		//检测是否存在loadTimeWeaver
		if (beanFactory.getTempClassLoader() == null && beanFactory.containsBean(LOAD_TIME_WEAVER_BEAN_NAME)) {
			beanFactory.addBeanPostProcessor(new LoadTimeWeaverAwareProcessor(beanFactory));
			beanFactory.setTempClassLoader(new ContextTypeMatchClassLoader(beanFactory.getBeanClassLoader()));
		}
}

从上面代码可以看到,invokeBeanFactoryPostProcessors里面主要实现是PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors());这行代码,那么其

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值