Spring IOC容器源码笔记

IOC容器是什么?

ioc其实是控制反转的缩写,它是一种广泛应用的编程思想。在javaweb中的ioc容器帮助我们解决了很多的问题,让我们的开发更加的便捷,并且实现了松耦合。
IOC思想就是将创建bean的关系不在互相依赖自己所在的类,也就是在一个bean中去new 我们的实现类。当业务变更时需要对代码进行侵入式的修改。而使用IOC容器的话,我们将创建bean的任务交给IOC容器去管理。我们只需要用的时候到IOC容器之中去取即可,我们使用xml或者注解等配置文件的方式实现对bean的管理。


IOC的两种实现方式

1.BeanFactory 是IOC的初级形式,只实现了IOC容器的基本实现。他没有集成Resource类去读取配置文件,没有集成BeanDefinitionReader(根据配置文件封装bean信息的类)等等。
2.ApplicationContext 可以自己根据不同的实现类去自动的读取配置文件或者扫描注解进行bean的生成,在getBean时触发依赖注入。常见的实现类有FileSystemxmlApplicationContext(根据文件路径读取配置文件),ClasspathApplcationContext(到项目的根目录下读取配置文件),WebApplicationContext(从web容器中读取配置文件)

当然无论是IOC容器的初级形式还是高级形态,都是为了管理bean的。beanfactory是完成了对于IOC容器最基本的定义,他不会去自动的装载我们的配置,也不会去自动解析我们的配置文件。这些都是由另外的类负责完成的,beanfactory只定义了一些基础的方法例如getBean()这种方法,他也是依赖注入的触发点。

这一部分的一些小Tips:

1.在factorybean中利用转义符号"&"来获取factorybean本身
2.并不是所有的bean都是在getBean时触发依赖注入完成对bean的初始化,在我们配置文件中指定lazy-init
可以在容器加载完成后就初始化改bean
3.在构造方法中的refresh方法会触发对一个容器的初始化
4.IOC容器初始化的步骤Resouce类进行①定位②载入③注册 然后将dom解析器解析出来的数据转换成
springIOC容器通用的数据结构BeanDefinition(其实最后是一个并发的hashmap持有该数据),并且将数据封装到holder中去
5.如果一个bean中有同名的property设置,那么第二个将不会进行解析,直接跳过,起作用的只有第一个。
6.Spring中有多种beanfactory,他们都有不同的实现方式,有的实现了可以设置双亲父容器,可以从中取
出bean,当然是优先从当前容器中取,找不到一直向上追溯父容器链直到找到为止

初始化bean的步骤
1.populatebean 完成bean的依赖注入
2.initializeBean 初始化bean
3.applyBeanPostProcessorsBefore

如果实现了initializingBean接口的话,会检查一系列的接口。紧接着会调用bean是否有initMethod方法,如果有的话调用该方法进行初始化。

关于bean的创建方式,使用的是strategy类,如果使用构造器初始化的话,使用jdk的动态代理,如果其他的初始化方式的话使用的是cglib方式的动态代理。

初始化bean过程

你可能感兴趣的:(Spring IOC容器源码笔记)