spring IOC 概述
控制翻转:spring之前对象是由使用者来进行控制的,有了spring之后,可以把整个对象交给spring来帮我们进行管理。其中IOC中涉及DI::依赖注入,把对应的属性的值注入到具体的对象中@autowired,populateBean完成属性值的注入。
容器:是存储对象的容器,使用map结构存储,在spring中一般存在三级缓存,singletonobjects存放完整的bean对象。
整个bean的生命周期,从创建到使用到销毁的过程全部都是由容器来管理的(bean的生命周期)。
IOC的详细处理过程
1.IOC容器的时候要涉及到容器的创建过程,首先创建bean工厂(根接口:beanfactory,常用的基本实现是:defaultlistableBeanFactory),然后向bean工厂中设置一些参数(BeanPostProcessor,Aware接口的子类)等等属性。
2.加载解析bean对象,准备要创建的bean对象的定义对象beandefinition(xml或者注解的解析过程)
3.beanFactoryPostProcessor的处理,此处是扩展点,其中placeholderConfigurationClassPostProcessor,configurationClassPostProcessor这两个类完成基本的设置功能。
4.beanPostProcessor的注册功能,方便后继对bean对象完乘具体的扩展功能。
5.通过反射的方式将beanDefiniton对象实例化成具体的bean对象。
6.bean对象的初始化过程(填充属性,调佣aware子类的方法,调佣beanPostProcessor前置处理方法,调佣init-mehtod方法,调用BeanPostProcessor的后置方法)
7.生成完整的bean对象,通过getBean方法可以直接获取对象。
8.销毁过程。
整体的流程图
bean的生命周期![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/997d4724cb998a8b77d8a6efd2fc7f70.png)
1)实例化bean,反射的方式生成对象
2)填充bean对象属性:populateBean(),循环依赖的问题(三级缓存)
3)调用aware接口相关的方法:invokeAwareMethod(完成beanName,beanFactory,BeanClassLoader对象的属性设置)
4)调用beanPostProcessor中的前置处理方法:使用比较多的有(ApplicationContextPostProcessor,设置applicationContext,Environment,Resourceloader,EmbeddValueResolver等对象)
5)调用initmethod方法:invokeInitmethod(),判断是否实现了initializingBean接口,如果有调用afterPropertiesSet方法,没有就不调用。
6)调用BeanPostProcessor的后置处理方法:spring的aop就是在此处实现的,abstractAutoProxyCreator注册Destuction相关的接口。
7)获取到完整的对象,可以通过getBean的方式来进行对象的获取。
8)销毁流程,1判断是否实现了dispoablebean接口,2,调用destroyMethod方法。
写在最后:有帮助欢迎点赞,有问题留言沟通,谢谢!