resolveBeanClass()方法
简单流程说明:
- 判断当前 Bean的Class有没有被加载
- 若被加载了, 则直接返回
- 若没有被加载,则执行 doResolveBeanClass()方法
doResolveBeanClass(方法)
流程简单说明:
- 获取类加载器
- 注意, 这边我们传进来的 typesToMatch 是null, 所以这个if我们暂时忽略掉
- 获取bean类型名称
- 解析Spring表达式
实例化前(后面有讲)
从这里开始具体的流程分析放到下面的大标题去讲解了, 因为我觉得具体的一个流程应该是在一个大标题下面的
doCreateBean()方法
简单流程说明:
- 实例化Bean
- 解决循环依赖
- 填充属性
- 初始化
- Bean的销毁
具体代码如下图所示, 一张图放不下....
由于 doCreateBean()方法内部是比较重要的, 所以我把这个方法拆解成了多个方法, 放在了下面的大标题写
四、实例化前
实例化前的的方法是 resolveBeforeInstantiation()方法, 具体进入实例化前的方法步骤请看上一个标题
设置初始化前要去使用类实现 BeanPostProcessor类, 并实现其内部的两个方法
该方法内部具体的实现如下所示
实例化前的方法执行完毕之后, 就会进入到 doCreateBean()方法
五、属性填充(@Bean方式)
代码如下
这里传进该方法的第三个参数是 bean的实例, bean实例的创建是在 doCreateBean方法中, 具体如下图所示, 正常来讲, 我们已经进行了实例化, 所以这个值是肯定存在的
接着往下走, 会看到一个 mbd.isSynthetic()判断, 这个也后面讲, 然后就看到了hasInstantiationAwareBeanPostProcessors() 这个方法判断, 有没有执行这个BeanPostProcessors
六、实例化后
这个很少能用到了, 就暂时不做讲解了, 感兴趣的可以自己去看一下
它的配置是在 @Bean注解上写成以下形式, 我们也可以看到, 现在已经不推荐我们使用这个方式去做注解了
@Bean(autowire = Autowire.BY_TYPE) public void test(){ } 复制代码
处理属性(@Autowired等注解)
再一次的去判断有没有实现 InstantiationAwareBeanPostProcessor 接口, 如果有的话就遍历去执行 postProcessProperties方法, 这个方法还是很重要的, 在Spring中, 是通过这个扩展点来处理@Autowired, @Resource等注解的
这个方法具体的实现, 我们通过以下方式进入, 通过 InstantiationAwareBeanPostProcessor类找到 postProcessProperties方法, 然后去看具体的实现类 AutowiredAnnotationBeanPostProcessor
实现的 postProcessProperties方法如下图所示, 这个后续也会讲到
初始化
我们回到 doCreateBean方法, 接着往下看初始化方法
该方法详情如下图所示:
Aware
可以看到最开始的核心就是调用了一个方法 invokeAwareMethods(beanName, bean);
下图是这个方法详情, 就不想洗讲了, 大概都能看的懂:
- 判断有没有实现 Aware接口
- BeanNameAware:回传beanName给bean对象。
- BeanClassLoaderAware:回传classLoader给bean对象。
- BeanFactoryAware:回传beanFactory给对象。
初始化前
初始化简单流程说明:
- 循环遍历 BeanPostProcessors
- 执行相应的方法
初始化
初始化简单流程说明:
- 判断有没有实现 InitializingBean
- 实现了调用 ((InitializingBean) bean).afterPropertiesSet();方法
- 如果 BeanDefinition指定了 InitMethodName(初始化方法的名字)
- 就执行对应的方法
初始化后(AOP)
初始化简单流程说明:
- 循环遍历 BeanPostProcessors
- 执行相应的方法
和初始化前的区别就是执行的方法换了