首先,官网中有这样一句话:Spring Framework implementation of the Inversion of Control (IoC) principle.这句话翻译过来就是:Spring实现控制反转(IOC)原理,由此可以得出,Inversion of Control(IOC)是一个名为控制反转的原理,而Spring实现了他。而实现这个原理或者说设计原则的最常见的方式也是Spring框架使用的方式叫做依赖注入,也就是Dependency Injection(DI)。因此我们要讲IOC实际上就是要讲Spring是怎样实现IOC和DI的,具体用什么、怎样去做的。
Bean是Spring实现IOC的一个重要的概念,官网是这样说的:
In Spring, the objects that form the backbone of your application and that are managed by the Spring IoC container are called beans. A bean is an object that is instantiated, assembled, and otherwise managed by a Spring IoC container.
通过这句话我们能看出来,bean实际上就是被Spring IOC容器实例化、组装、管理的对象。也就是说,创建并且管理对象的事儿不用我们去管了,这些都交由Spring框架的IOC容器去管理,这也就是控制反转的思想,而bean就是我们注入的对象。而bean什么时候去实例化将不会再写死在程序中,也就是我们不需要将对象实例化,只需要用的时候去拿就行了,这种方式不仅让我们不用再花心思管理对象,而且也能避免我们自己一些错误的实例化对象导致的内存问题。
BeanFactory是Spring IOC的本质,他的存在解决了bean的生产于管理,并且Spring还将bean的各个生命周期阶段的管理接口暴露给我们,我们只需要实现这些接口那么在bean的生命周期阶段中,spring就会调用我们的接口实现去对bean做出相应处理。
Spring通过BeanDefinitionReader通过扫描我们项目中使用了@Component或者@Configuration注解的类,获取到BeanDefintiions,将他们注册到BeanFactory中。BeanFactory通过conCurrentHashMap存储bean的信息,key即为bean的名称,Value就是BeanDefintiions,BeanDefintiions就是Bean的一些元数据,比如类名、是否抽象等定义。
实现BeanFactory的实现类有多种,具体细节与取舍可以参考源码或者官方文档查看
到这里我们其实对Spring IOC已经有了一个自己的理解,其实就是我们把类通过不同的方式注入到容器中,我们代码中只需要拿到这个bean然后去用就可以了,至于对象的生命周期都交给了我们的IOC容器去管理。
感谢各位大佬的光临,Spring IOC的细节有很多,每一个点都可以拿出来单独写一篇博客了,因此此篇博客以较为精简的介绍为主,想要探究更深层次的细节可以通过结合官方文档的介绍与源码去理解,好了不说废话了,再次感谢各位大佬能看到这里,如果该文章由任何问题欢迎各位大佬指出,谢谢