SpringIOC总览

2019-08-06  本文已影响0人  耐得千事烦
springLogo.jpg

什么是IOC?

当我们在写程序的时候,需要一个对象的时候,我们通常是用new关键字的方式来创建一个对象,然后对这个对象进行操作,当对象操作完毕以后还需要对这个对象进行销毁操作,这一过程我们可以称之为正向的过程,创建对象和销毁对象的控制权是在我们操作人的手里。但是这一正向过程繁琐且复杂,而且会造成创建的对象与依赖它的对象之间代码耦合的情况,针对这个情况我们需要解耦。需要把创建对象的过程移交出去,然后只是在需要这个对象的情况下引入进来即可(一句话来说就是把创建对象的控制权移交出去),这也就是我们所经常提到的控制反转也就是IOC。而为了实现这种控制反转的思想,spring通过依赖注入的方式来实现(基于属性的注入、基于构造器的注入、基于注解的注入),而依赖注入就叫做DI。IOC是一种思想,而DI是实现这种思想的一个手段。

IOC的实现原理?

IOC的底层实现原理其实就是工厂模式和反射。作为IOC的最顶层的接口BeanFactory,其实里面就是定义了各种getBean的方法,可以理解为定义了IOC容器最基础的API。IOC通过读取配置文件(比如XML文件)来获取到需要生成的对象的信息,然后通过生成BeanDefinition对象来存储到IOC容器里,等到第一次调用getBean的时候,根据BeanDefinition来生成需要的对象实例。而这中间的过程就是通过反射的机制来实现的。

IOC的实现过程涉及到的步骤?

IOC的实现过程其实分为俩部分,第一部分可以称为加载,第二部分称之为初始化。第一部分加载分为三个部分1.定位配置文件、2.读取文件并加载成BeanDefinition对象、3.将BeanDefinition对象注册到BeanFactory里面(其实也就是将BeanName与BeanDefinition形成对应关系put到一个ConcurrentHashMap里面) ,而这三个步骤就是第一个部分:加载。第二部分称为bean的初始化,而这一过程的触发条件是第一次调用getBean的方法来触发的,初始化也分为三个步骤:1.完成bean的实例化,但是此时虽然已经完成bean的实例化但是并没有进行属性的赋值处理、2.完成属性的注入(可以理解为对象进行赋值处理)、3.回调这个bean对象实现的各种接口的方法诸如BeanNameAware、InitializingBean 、BeanPostProcessor等相关接口。

IOC的相关组件

中文意思即是资源、它是对资源的一种抽象。它的每一个实现类都代表了一种资源的访问策略,如ClasspathResource 、 URLResource ,FileSystemResource 等。有了资源,就应该有资源加载,Spring 利用 ResourceLoader 来进行统一资源加载。

作为整个IOC里面最基础的容器,提供了完整的获得对象的方法。而它的内部维护了一个BeanDefinition Map用来维护,并可根据 BeanDefinition 的描述进行 bean 的创建和管理。BeanFacoty 有三个直接子类 ListableBeanFactory、HierarchicalBeanFactory 和 AutowireCapableBeanFactory,而DefaultListableBeanFactory 为最终默认实现,它实现了所有接口。

BeanDefinition 是用来描述 Spring 中的 Bean 对象信息的。可以理解为BeanDefinition是代码层面的Bean。

BeanDefinitionReader 的作用是读取 Spring 的配置文件的内容,并将其转换成 Ioc 容器内部的数据结构:BeanDefinition

它叫做应用上下文,与我们应用息息相关,她继承 BeanFactory,所以它是 BeanFactory 的扩展升级版(其实AppliciationContext内部是有一个DefaultListableBeanFactory的,所有基础的容器方法都是由DefaultListableBeanFactory来操作的)。由于 ApplicationContext 的结构就决定了它与 BeanFactory 的不同,其主要区别有:
1.继承 MessageSource,提供国际化的标准访问策略。
2.继承 ApplicationEventPublisher ,提供强大的事件机制。
3.扩展 ResourceLoader,可以用来加载多个 Resource,可以灵活访问不同的资源。
4.对 Web 应用的支持。

ApplicaitonContext与BeanFactroy的区别?

IOC是如何解决循环依赖的问题?

beanFactory与FactoryBean的区别?

关于IOC容器的事件机制

以上几个问题将会在后面另开章节来说明

上一篇下一篇

猜你喜欢

热点阅读