vlambda博客
学习文章列表

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是通过finshBeanFactoryInitializationbeanFactory)来初始化代码的。

这个方法中有一个方法beanFactory.preInstantiateSingletons(),这个方法是实例化所有的单例,非懒加载。

好的,

下节我们要讲

Spring 循环依赖

Spring 循环依赖怎么解决

Spring当中默认单例支持循环

怎么证明它是默认支持的?怎么关闭循环依赖

Spring解决循环依赖的细节---源码

如果,你看到我的讲解,觉得能学到点,请点击下我的关注,带你熟悉spring,优雅的去写代码。