品牌型号:联想ThinkPad X1
系统:Windows10家庭版
软件版本:Spring 5.3.7
Java程序员在开发的时候,经常会用到Spring框架,Spring已经成为了我们技术选型时不可或缺的工具,你是新手小白也好、技术大神也罢,在日常接口开发或者负责系统搭建的时候,使用Spring框架搭建一定会感受到它带来的便捷,学好Spring是很重要的,很多程序员对Spring的认知往往只停留在了注解调用、配置文件编写的层面,但是说到核心原理却一知半解,”SpringIOC是什么”、“Spring容器启动过程”是面试时经常被问到的,为了让大家对Spring框架有更深刻的理解,那么接下来我们就从这两个问题出发,帮助大家加深对Spring的理解。
一、Spring IOC是什么
Spring IOC是一种思想,说起Spring IOC我们就不得不提出早期Java Web开发遇到的痛点了,我们在写Controller、Service、Dao三层代码时,会发现层与层之间高度耦合,而且接口和其实现类也紧密耦合在一起。

在实际开发的时候,如果对象之间高度耦合,一处改动就会影响多处,牵一发而动全身,大大增加了维护成本,就更不要说扩展了,稍有不慎,某一个小小的改动会导致整个系统崩溃甚至跑不起来。

这时候Spring带着它的IOC控制反转思想来了,IOC思想强调的是将原来在程序里创建Bean对象的权力,交给第三方工厂来管理。例如原来在程序中需要手动new的对象,交给Spring容器,这样程序中的对象之间就解除了直接关联。Spring容器统一管理bean的生成,开发者不再关注对象如何创建、如何关联,只需要专注于业务逻辑本身。

二、Spring容器启动过程
上文我们有提到过Spring容器,它算是IOC思想的载体,将Bean交给Spring管理之后,Spring容器会负责对象的创建、依赖注入还有生命周期的管理。Spring容器主要分为两种,一个是BeanFactory一个是ApplicationContext,Application是BeanFactory的子类,功能相对来说更完善些,平时我们写的 ClassPathXmlApplicationContext、AnnotationConfigApplicationContext都是ApplicationContext的实现类,所以启动过程基本上是一样的。

为了方便一些初学者,我们这里就以ClassPathXmlApplicationContext来说,在new ClassPathXmlApplicationContext创建容器对象的时候,Spring会先初始化容器的核心组件,再加载Resource下的配置文件applicationContext.xml,容器会解析这个配置文件中的bean标签,根据bean去提取每个Bean的类路径、依赖关系、作用域等信息形成一个Bean定义注册表,这时候Bean其实还没有被创建。

下面就开始正式给Bean实例化、依赖注入,如果bean配置了lazy-init属性为true,那么暂时不会被实例化,当所有非懒加载的单例Bean都实例化成功并且依赖注入这个动作也都完成了,容器就会去执行一些后置处理操作,例如我们在bean中配置的初始方法,待所有Bean初始化完成后,Spring容器才算是启动完成了。

以上就是Spring IOC是什么,Spring容器启动过程的全部内容了。Spring IOC是一种思想,将原本通过硬编码创建Bean的权力交给了Spring容器,降低项目代码的耦合度、简化开发并且减少维护成本。Spring容器会统一负责管理bean的创建, Spring容器在创建实例的时候,会加载配置文件并读取里面的配置,将bean的信息暂存起来,再依次创建非懒加载的单例Bean并识别、注入依赖,最后执行后置处理操作,等这些操作完之后,Spring容器正式启动完成。