Springboot注解类初始化

Springboot注解类扫描及beanDefinition注册,请参考https://blog.csdn.net/leadseczgw01/article/details/128969203,启动步骤请参考https://blog.csdn.net/leadseczgw01/article/details/128930925。

加载注解类从刷新上下文开始。

Springboot注解类初始化_第1张图片
Springboot注解类初始化_第2张图片

从AbstractApplicationContext的finishBeanFactoryInitialization方法开始,初始化所有非懒加载的bean。

在preInstantiateSingletons方法中先将BeanDefinition转变为RootBeanDefinition(主要为处理关联的父BeanDefinition)。

Springboot注解类初始化_第3张图片

如果不是工厂类,直接进入getBean方法。

Springboot注解类初始化_第4张图片

在doGetBean方法中先从单例缓存中获取(getSingleton)

Springboot注解类初始化_第5张图片

在getSingleton方法中可以看到三级缓存,主要用于解析循环引用。

Springboot注解类初始化_第6张图片

如果没有循环引用,则从下面的getSingleton开始创建实例。

Springboot注解类初始化_第7张图片

在创建单例前,会调用beforeSingletonCreation方法,把当前beanName加入到当前正在创建单例的集合中。

Springboot注解类初始化_第8张图片
Springboot注解类初始化_第9张图片

然后获取当前单例的创建工厂类,也就是前面调用getSingleton时传入的ObjectFactory参数(匿名类,类中主要有一个createBean方法),通过该工厂类创建单例。

Springboot注解类初始化_第10张图片

在createBean方法中会执行doCreateBean方法创建单例。

Springboot注解类初始化_第11张图片
Springboot注解类初始化_第12张图片
Springboot注解类初始化_第13张图片

在初始化单例前,先获取初始化策略,当前为Cglib方式。

Springboot注解类初始化_第14张图片

然后进入SimpleInstantiationStrategy的instantiate方法,先从RootBeanDefinition中获取class对象,然后通过class对象获取默认构造器。

Springboot注解类初始化_第15张图片

然后将构造器对象作为参数传递给BeanUtils.instantiateClass进行对象的创建。

Springboot注解类初始化_第16张图片

在通过构造器创建实例对象时,先会执行ReflectionUtils.makeAccessible(ctor)确保构造器可访问,同时处理下参数,最后使用构造器创建实例对象(java反射)。

Springboot注解类初始化_第17张图片

后续还会对创建的实例进行一次封装及其它处理。

Springboot注解类初始化_第18张图片

在AbstractAutowireCapableBeanFactory类的doCreateBean方法中,虽然前面得到了实例,但为了解决循环依赖问题,会执行addSingletonFactory方法(主要进行三级缓存)。

Springboot注解类初始化_第19张图片

在addSingletonFactory方法中,往singletonFactories(三级缓存)中存储创建bean的工厂方法,同时在earlySingletonObjects(二级缓存)中移除掉可能存在的实例。

Springboot注解类初始化_第20张图片
Springboot注解类初始化_第21张图片

你可能感兴趣的:(java,spring,boot,java,spring)