概念:ioc容器指的就是spring容器,用来存放各种对象(xml里配置的bean节点,@repostiory、@service、@controller、@component),实际就是一个map(Key,Value)项目启动时会读取配置文件里的bean节点,根据全限定类名使用反射创建对象到map里,扫描到上述注解的类还是通过反射创建对象放到map里。
这时map里就有各种对象,用这些对象时,再通过DI(依赖注入)(autowried、resource等注解)把属性往依赖里注入(对象的属性需要赋值)。
控制反转:没有引入ioc容器之前,对象a依赖于对象b,对象a在初始化或者运行到某个点时,自己必须主动创建对象b或者使用已经创建对象b,无论是创建还是使用,控制权都是在自己手里。
引入ioc之后,对象a和对象b之间失去了直接联系,对象a需要对象b时,ioc会主动创建一个对象b注入到对象a需要的的地方。这时主动就变成了被动行为,就是控制反转。
全部对象的控制权全部上交到第三方ioc容器,ioc就成了整个系统的关键核心,起到了粘合剂的作用。
总:
理论思想:原来的对象是由使用者进行控制,有了spring之后,可以把整个对象交给sprinng来帮我们进行管理。
依赖注入(DI):把对应的属性的值注入到具体的对象中,@Autowired,populateBean完成属性值的注入
实现控制反转的,获得依赖对象的过程被反转了,控制被反转后,获得依赖对象的过程由自身管理变味了由ioc容器主动注入,ioc容器运行期间,动态的将某种依赖关系注入到对象中。
容器:存储对象,使用map结构来存储,在spring中一般存在三级缓存,singletonObjects存放完整的bean对象,整个bean的生命周期,从创建到使用到销毁的过程全部都是由容器来管理(bean生命周期)。
spring中的bean都是通过反射的方式生成的,同时其中中包含了很多扩展点,比如最常用的BeanFactory的扩展,对bean的扩展(对占位符的处理),我们在公司对这方面的使用是比较多的,除此之外,ioc中最核心的也就是填充具体bean的属性和生命周期。
spring IOC底层实现
底层实现:getBean,doGetBean(加do的方法都是实际干活的方法),createBeanlnstance,populateBean,createBeanFactory,initializingBean。
1.先通过createBeanFactory创建一个Bean工厂(DefaultListableBeanFactory)
2.开始循环创建对象,因为容器中的bean默认是都是单例的,所以优先通过getBean,doGetBean从容器中查找,查找不到的话。
3.通过createBean,doCreateBean方法,以反射的方式船舰对象,一般情况下使用的是无参构造方法(getDeclaredConstructor,newinstance)。
4.进行对象属性填充populateBean
5.进行其他的初始化操作(initializingBean)