继续创建Bean的过程,
1 通过默认的构造方法实例化对象
下面准备一个案例
打断点跟进一下,直接到doGetBean
因为是原型作用域
进入createBean
进入doCreateBean
获取到默认的构造方法
通过构造方法实例化
接下来继续获取bean,可以直接从缓存中拿默认的构造方法
直接赋值
反射实例化
2 我们可以指定构造方法实例化对象
继续断点跟进
这里是关键
获取到四个构造方法
存入缓存
通过获取到我们定义的构造方法,实例化对象
下面开始实例化
实例化之前需要选择策略
看下策略接口,有三个实例化方法
再看下子类:SimpleInstantiationStrategy,有五个实例化方法
再看SimpleInstantiationStrategy子类:CglibSubclassingInstantiationStrategy
先简单总结一下:
下面来具体看下这五个实例化方法
1 SimpleInstantiationStrategy的无参构造实例化方法
反射实例化
2 SimpleInstantiationStrategy的有参构造实例化方法
3 SimpleInstantiationStrategy类的工厂方法实例化
4 CglibSubclassingInstantiationStrategy 无参构造实例化
5 CglibSubclassingInstantiationStrategy 有参构造实例化
到这里bean就已经实例化了,接下来继续看源码
讲到这里有两个注解@Postconstruct,@PreDestroy,这里主要是处理这两个注解的
看下实现类
看下CommonAnnotationBeanPostProcessor
看父类
构建生命周期元数据
这样看起来很抽象,断点看下就清楚了,写个案例
断点,1 实例化对象
判断是否有@Postconstruct,@PreDestroy
查找到两个注解修饰的方法
再修改beandefinition
添加到集合
注意:这里只是查找出这两个注解修饰的方法,再后续才会真正调用,这里先暂时讲到这里