「这是我参与2022首次更文挑战的第6天,活动详情查看:2022首次更文挑战」
上次看到IOC容器的资源加载过程,接下来我们看看容器的启动流程。
容器的启动流程
Spring的IOC容器的启动大致可以分为两大阶段:1、容器的启动,2、bean的实例化阶段。在这两个阶段,Spring为我们暴露了一些接口,让我们可以插手容器启动,对bean的定义信息做一些操作,从而实现一些更加强大的操作。
容器的启动
这个阶段时容器自身启动的阶段,这个阶段需要加载和解析配置信息,根据配置信息将bean定义(BeanDefinition)加载到容器中,以及一些其它的后置处理。此时只是扫描bean定义,而未将bean进行初始化,自然也不会有注入。
上节我们知道了,ClassPathXmlApplicationContext本身作为资源加载器,它可以根据规则加载类路径下的配置信息,在xml中我们可以配置bean的定义信息。ClassPathXmlApplicationContext就是通过解析xml中的bean标签来加载beanDefinition。不同类型的容器解析的策略不一样,像AnnotationConfigApplicationContext则是通过包扫描,判断类上是否有注解来加载beanDefinition。不管怎样,最终容器里面肯定带有我们所配置的需要实例化的bean。在进一步操作之前,Spring提供了接口BeanFactoryPostProcessor,这个接口提供了对容器的beanDefinition的后置操作,如果我们对Spring加载的bean信息有需要改动的地方,可以通过改接口获取Spring容器,然后就可以对容器内的bean定义进行修改。主要的场景如下,如果需要对数据库的用户名,密码在配置文件中进行加密,容器加载完成后可以用此接口对加密的数据库信息解密,之后就可以正常连接到数据库了。
bean的实例化
经过以上流程,我们就可以对bean进行初始化了,通过bean的定义信息,Spring在此阶段会对bean实例化以及注入等操作。