IOC(控制反转)、DI(依赖注入)是Spring的特性中耳熟能详的两种
平时我们获取Bean都是采取自动注入,或者使用getBean()方法,器根本原理,如下图:
平时我们知道的类也就是ApplicationContext,因为他是Spring的主入口。当IOC容器初始化时,会读取配置文件application.xml,然后根据扫描的类,生成Bean缓存起来,存到内存里面(不重复读取,不重复加载配置文件)
首先,BeanDefinitionReader,他是一个方法类,它的作用就是讲配置文件进行读取,并且将类的配置信息读取到BeanDefinition中
Bean常用的类型:
prototype(每次用一个new一个)
singleton(生成一次一直在)
proxy(代理对象,新的字节码文件去实现原来的类)
其他类型等等
BeanDefinition类的作用,就是保存我们读取到的配置信息,保存生成的Bean的一些配置信息
当我们创建一个对象时,他会先去BeanDfinition中,根据对象的标识获取对象的基本配置信息,然后才能够创建出对象。
那BeanWrapper类的作用呢?请先看以下伪代码
Class A{
private B b;
}
Class B{
private A a;
}
这是对象的一种依赖方式,循环依赖,当我们注入A对象时,发现需要B对象,而当我们创建B对象时,又需要创建A,那这怎么解决呢?
Spring会先把所有的对象在容器中创建出来(无参),但是对象的引用,会先保存起来,这些引用先保存到一个包装器BeanWrapper中,这个类,只保存对象的引用。
然后我们根据BeanWrapper中对应对象的标识,去找寻它的引用,并把对象构造赋值,依次类推。
Spring容器创建A时,根据包装器中的引用去拿到B(半成品,无参),而当Spring容器创建B时,再根据包装器中的引用去拿A,此时A不是半成品,而是完成的A,然后返回上一级,B的引用锁指向的不再是半成品,而是完整版的B(如有不懂,点击这里)
BeanWrapper起到了一个缓冲,完善的作用。
这便是IOC中3个最重要的类:BeanDefinition、BeanWrapper、AppliactionContext
新手小白,欢迎各位大佬评论指导☺
来源:CSDN
作者:吃着火歌唱着锅
链接:https://blog.csdn.net/People_lost_Heart/article/details/104721275