bean实例化 ----> 填充属性 ---->Aware回调方法 ----> 初始化 ---->
在这里插入图片描述
beanFact
beanFactoryPostProcessor 是在beanDefinition后执行的,可以用于对benaDefiniton里面的属性进行修改
Spring 先去扫描类,然后根据这些类上面的注解,生成beanDefinition,然后将其放到beanFactory中有个Map属性中去,叫beanDefinitonMap
BeanFactory扫描完之后,就组建完成了,但是里面存的只是beanDefiniton,还不是最终的bean对象。
beanFactoryPostProcessor 是当beanFactory组建完成之后,就可以执行了,beanFactory组建完成的标志就是Spring把所有的类都扫描到,并转为beanDefinition存入到beanFactory的成员属性beanDefinitonMap中,然后beanFactory.getbean()方法执行时,就是去取这里面的definition,然后将它转为bean,存入到singtonMap中
beanPostProcessor是在实例完成之后,就可以对这个实例进行操作了,也就是new 这个类之后,就可以用这个处理器进行相应的操作了
这是注入属性之前的操作,先向earlyProxyReference里面put这个bean(原始对象),这样,之后真正进行到AOP这个操作的时候,就可以判断一下这个Map里面有没有值,如果有值,就说明已经生成过代理对象了,这样真正执行AOP的这个步骤,就不需要执行AOP了
真正执行AOP的操作
为什么需要三级缓存
第三级缓存 存的是一个lambda表达式,而这个lambda表达式只有在发生循环依赖的情况下,才会去执行
如果没有发生循环依赖,第三级缓存也会存这个lambda表达式,只不过不会去执行这个lambda表达式,也就不会放到二级缓存里面去。
二级缓存的作用:是真正执行AOP这个操作的时候,去这个二级缓存里面去查看有没有值,如果有值,则不会发生AOP(循环依赖的情况),如果没有值,则发生AOP(没有发生循环依赖)