简单说一说 spring Ioc 容器如何加载 bean 的

面试经常被问到的题目:在 spring 中,一个 bean 是如何被加载的,简单说一说它的生命周期。

1 个解决方案

AllenJiang
中间件研发,关注微信公众号 : 小哈学Java, 回复"666", 即可免费领取10G学习&面试资料

这里以加载一个 xml 中声明的 bean 为切入点,简单说下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">


    <bean class="com.test.spring.People"/>


</beans>

通过以下代码,看下 bean 是如何被加载到 Ioc 容器中的:

ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("spring-test.xml");
context.start();
People bean = context.getBean(People.class);

通过 debug, 可以看到 Ioc 容器要做的工作可分为以下三个阶段(以注解的方式注册的 bean 大同小异):

1.加载资源 xml

2.先创建 BeanFactory, 解析 xml 文件到 BeanDefinition 并注册到 factory 当中去

3.对 beanFactory 进行初始化,对 bean(Singleton, 非 LazyInit, 非抽象的 bean)进行创建

总结以下 Ioc 容器三大块

  • 加载解析注册 bean (BeanDefinitionReader)
  • 定义 bean (BeanDefinition)
  • 管理 bean (BeanFactory)

大致参照以下 Ioc 加载 bean 体系思维导图:

BeanDefinition 加载解析与注册

Bean 的获取与创建