Spring5源码解析(bean实例化)
在上一边的博客里面已经介绍:spring在bean扫描过程,已经将所有的bean保存在一个beanDefinitionMap的map对象中,但是这些bean还是一个beanDefinition,还没进行实例化的,所以这次就重点解析bean的实例化过程。
bean扫描过程源码分析:blog.csdn.net/qq_24101357…
- finishBeanFactoryInitialization(beanFactory);
- 合并父类,RootBeanDefinition bd = getMergedLocalBeanDefinition(beanName); 举个例子说明一下,不怎么重要:
1 | java复制代码<bean id="parentBd" class="com.llsydn.merge.PcBd"> |
上面的代码,主要是实现bean实例化的准备过程,从beanDefinitionNames中拿到被扫描出来的所有beanName。
然后遍历beanDefinitionNames,一个一个的调用getBean()方法,实例化这些bean对象。
- getBean(beanName)
- isSingletonCurrentlyInCreation 以为还没有需要创建对象的时候。
spring自动装配的模型 不等于 自动装配的技术。
- no 会使用 bytype技术
- bean的默认自动装配模型 == no
1
2
3
4
5
6
7
8
9
10
11
12 > kotlin复制代码public class OrderService{
> IndexService indexService;
> }
> 这个indexService,直接忽略了装配
>
> public class OrderService{
> @Autowired
> IndexService indexService;
> }
> 这个indexService会先使用bytype技术自动装配,找不到再使用byname自动装配
>
>
- 下面进入到doGetBean()进行分析
1 | java复制代码protected <T> T doGetBean(final String name, @Nullable final Class<T> requiredType, |
- createBean(beanName, mbd, args); 分析
1 | java复制代码@Override |
- Object beanInstance = doCreateBean(beanName, mbdToUse, args); 分析
1 | java复制代码protected Object doCreateBean(final String beanName, final RootBeanDefinition mbd, final @Nullable Object[] args) |
doCreateBean()方法主要的作用:
1.先利用反射技术生成bean的实例对象。createBeanInstance(beanName, mbd, args)
2.对实例对象的属性,进行自动装配。populateBean(beanName, mbd, instanceWrapper);
3.执行后置处理器,进行bean增强。 initializeBean(beanName, exposedObject, mbd);
- createBeanInstance(beanName, mbd, args) 利用反射技术实例化对象
1 | java复制代码protected BeanWrapper createBeanInstance(String beanName, RootBeanDefinition mbd, @Nullable Object[] args) { |
createBeanInstance主要的步骤有:
1.判断bean是否可以访问。
2.判断bean是否有factory-method方法,如果有就调用factory-method方法实例化对象
3.判断bean是否是第二次实例化,并是否存在快捷方式实例化对象。
4.判断bean的构造方法:1.当bean有无参构造方法,就默认使用该无参构造方法,实例化对象
2.当bean只有一个有参构造方法,就使用该有参构造方法,实例化对象
3.当bean有多个有参构造方法,使用无参构造方法,实例化对象。(spring无法判断要用那个构造方法)备注:spring是使用构造方法方式,实例化对象
- determineConstructorsFromBeanPostProcessors() 用哪个构造方法实例化对象,交给BeanPostProcessors处理
1 | java复制代码protected Constructor<?>[] determineConstructorsFromBeanPostProcessors(@Nullable Class<?> beanClass, String beanName) |
本文转载自: 掘金