spring容器

465 阅读2分钟

是什么

就是一个集合,里面放了很多数据,每个数据就是所谓的bean。

更具体的说,其实就是一个容器类的实例对象包含了一个bean集合,这个bean集合就是map键值对,键是bean名字,值是bean。

但是这个bean不是真正的bean实例对象,而只是xml bean的映射,即把xml bean转换为BeanDefinition。BeanDefinition只是定义了bean的各种关系,比如依赖了哪些bean。

那何时创建bean实例对象?第一次用的时候,即第一次请求控制器的时候,会创建控制器这个bean的实例对象,并且会注入数据。

说白了,容器主要干了2个事情
1.创建BeanDefinition
把xml里的bean转换为BeanDefinition,然后写到容器类的map里去。
2.创建bean实例对象,并且创建注入数据的实例对象
第一次用的时候,才会创建。而且会递归创建,即通过xml里的所有的bean定义,创建了所有的bean实例对象,以及通过bean的依赖数据,创建了依赖数据的实例对象,而且会递归创建,最终创建了所有的bean实例对象。

容器核心实现类DefaultListableBeanFactory

容器的实现类就是这个类,其他的实现类都是在这个实现类的基础之上,加了一点点的功能。比如,xml实现类,就是从xml配置文件读取bean。

bean存储在哪里?

我们都知道,bean是在容器里,那容器怎么持有bean?

类继承图

其他实现类XmlBeanFactory

实际项目中最常用的容器实现类是ClassPathXmlApplicationContext和FileSystemXmlApplicationContext

类继承图

那和DefaultListableBeanFactory的关系是什么?

底层也是用的DefaultListableBeanFactory。

核心步骤总结

1、解析xml配置了所有bean以及注入数据(以xml方式或注解方式注入数据),得到BeanDefinition
这个时候只是得到Bean的BeanDefinition,bean对象还没有创建,注入数据也还没有开始。

2、第一次用一个bean的时候,会从容器获取bean(容器类有个获取bean的方法),这个时候干2个事情
1)创建bean对象
这个时候创建的是真正的bean对象
2)创建bean对象的时候,会根据BeanDefinition(作用:1.声明了bean 2.声明了bean和他的注入数据),向该bean注入数据
创建注入数据的实例对象

3、注入数据的时候,如果有嵌套注入,那么一直嵌套创建bean和向bean注入数据

4、直到处理完xml里的每个声明的bean,那么也就处理完了所有的bean,并且还有bean之间的互相注入或者嵌套注入关系

用注解注入数据,和用xml注入数据,没有任何区别,只是少写配置而已。

spring springboot的作用,也是让你少写代码。