Java小结 spring源码分析(一)
下面我要讲的知识点包括:
Spring 循环依赖---属性注入---自动注入
Spring的生命周期
Spring bean实例的大概过程
问:依赖注入的功能在生命时候完成还是初始化就完成?
答:是在初始话完成。看下面代码。
例如:IndexService index =ac.getBean(IndexService .class);
那么 初始化class-->bean有一个初始化的过程这就是SpringBean的生命周期。
问:Spring bean的生命到底在那个步骤完成依赖注入?
我们来分析下源码:
Classloder(bootstrap,extention,application)类加载器把spring拿出来会不会立即new 一个实例?不会,有可能是单例 ,有可能注解让懒加载,还有按照type name注入 ,他不知道怎么给你实例化,所以spring拿到类的第一步不需要进行实例化。拿到类怎么办,spring采取用一个对象来存储这些类的信息,BeanDefinition的子类,这个子类存储。多个需要初始化对应多个 BeanDefinition 对象
然后把这些对象存在map中。这个时候能够扩展spring的小伙伴在这个时候就会产生分支了,二次扩展。调用一个方法preInstantiateSingletons(),对这个beanDefinitiation进行解析,是不是单例等... 单例对象会放在单例池中(map)等。
那么进行spring二次扩展的小伙伴怎么扩展?
只需要实现一个接口BeanFactoryPostProcessor,进行扩展spring就会调用扩展的一些方法,你自己实现的方法,spring在调用这个方法。比如说,beanDefination 有一个属性是x 你实现了扩展接口,把他改成y 那么 spring会把你的这个属性改成y。
说了那么多,你大概可能明白了,spring类加载器把要加载的类加载出来,并不马上去实例化,而是把这些类属性定义都交给了beanDefination 然后存放在map工厂中。
看下面代码:
通过分析源码可以知道spring是通过finshBeanFactoryInitialization(beanFactory)来初始化代码的。
这个方法中有一个方法beanFactory.preInstantiateSingletons(),这个方法是实例化所有的单例,非懒加载。
好的,
下节我们要讲
Spring 循环依赖
Spring 循环依赖怎么解决
Spring当中默认单例支持循环
怎么证明它是默认支持的?怎么关闭循环依赖
Spring解决循环依赖的细节---源码
如果,你看到我的讲解,觉得能学到点,请点击下我的关注,带你熟悉spring,优雅的去写代码。