一、spring 扩展接口

扩展接口 使用
BeanFactoryPostProcessor 处理所有bean前,对bean Factory进行预处理
BeanDefinitionRegistryPostProcessor 可以添加自定义bean
BeanPostProcessor 在并初始化前后、后对bean进行处理
ApplicationContextAware 可以获得ApplicationContext及其中的bean
InitializingBean 在bean创建完成,所有的属性注入完成执行
DisposableBean 在Bean销毁前执行
ApplicationListener 用来监听产生的应用事件

二、spring中ApplicationContext的默认加载流程

image

GetBean 的大概过程:

  1. 先试着从单例缓存对象里获取。

  2. 从父容器里取定义,有则由父容器创建。

  3. 如果是单例,则走单例对象的创建过程:在 spring 容器里单例对象和非单例对象的创建过程是一样的。都会调用父 类 AbstractAutowireCapableBeanFactory 的 createBean 方法。 不同的是单例对象只创建一次并且需要缓 存起来。 DefaultListableBeanFactory 的父类 DefaultSingletonBeanRegistry 提供了对单例对 象缓存等支持工作。所以是单例对象的话会调用 DefaultSingletonBeanRegistry 的 getSingleton 方法,它会间 接调用AbstractAutowireCapableBeanFactory 的 createBean 方法。

    三、bean的作用域

    默认是单例的
    xml:配置
    注解:@Scope(”prototype”) :prototype/singleton

四、总结

如果是 Prototype 多例则直接调用父类 AbstractAutowireCapableBeanFactory 的 createBean 方法

bean的创建
IOC就是一个bean的集合,bean的创建也由他负责,那么什么时候创建,怎么创建bean?

需要考虑bean的scope,一种singleton,一种prototype;还有是延迟加载属性
singleton就是只创建一次,会放到一个map中,以便下次使用;prototype就是每次都创建一个新的实例

bean的属性注入
也一样,什么时候注入,怎么注入

在创建bean之后,先找到需要注入的属性,也就是@Autowired注解的方法,或者属性
方法就需要调用,属性就需要修改值;

五、springboot自动配置流程理解

image
参考:https://www.cnblogs.com/trgl/p/7353782.html

六、spring bean相互依赖的解决方法:三级缓存

一级缓存:image
二级缓存:
image

image
参考:https://www.jianshu.com/p/10f94b776e55