Spring IOC源码总览
1.如何学习源码
1.坚持,一定要静下心来有耐心去debug,里面方法调用很深,有很多方法递归,如getBean -> doGetBean -> createBean ->doCreatBean属性填充时又会递归到getBean。
2.顺序,阅读源码一定要先理解框架的总体流程,再看细节。当阅读到某个方法时也是先理解方法的核心功能再理解细节
3.注释,一定要看代码的注释,特别是重点的扩展接口,如BeanFactoryPostProcessor,BeanPostProcessor和它们的子接口。
4.工具,当遇到不懂的地方一定要结合网上的文章或AI工具,看下别人是如果解释的
5.重复,一定要反复的debug,反复的看。Spring源码想要一两遍就吃透是不可能的。一定要去真正的理解它,比如面试的时候问到你Spring源码,你的回答是背八股文还是真正的理解了,其实很容易就能看出来
2.为何从IOC开始
Spring IOC是Spring生态的核心架构,包括Spring AOP也是基于IOC做的扩展,只有先理解Spring IOC源码后再阅读其他框架源码时才能游刃有余。
整个源码篇将由底层到应用层按顺序分析源码,Spring IOC,Spring AOP, Spring MVC, Springboot
3. IOC和DI的理解
1.IOC的理解
IOC 即 Inversion of Control,翻译为控制反转,何为控制反转。在没有使用Spring框架时,当我们需要创建一个对象时需要我们在程序中主动的去通过new来创建,此时对象的控制权在开发者手中。而使用了Spring IOC容器后,将有Spring IOC容器为我们创建和管理对象,此时对象的控制权交给了Spring IOC容器。所以被称为控制反转。
2.DI的理解
DI 即 Dependency Injection,翻译为依赖注入,何为依赖注入。网上有很多人描述的是:IoC 和 DI 其实是同一个概念的不同角度描述。而我并不这么认为。我认为IOC是将对象交由Spring IOC容器管理。而DI 则是负责构建容器中对象间的依赖关系。比如A a = new A(); 而A有一个B类型的属性b。当容器创建A时仅仅调用了A无参构造创建了一个A对象,此时A对象的b属性并没有被赋值。而DI 则就是描述是将A的b属性赋值的过程。
4. IOC容器BeanFactory和ApplicationContext
1.BeanFactory
BeanFactory是Spring框架中最基本的IoC容器,提供了基本的依赖注入功能,采用延迟加
载策略,只有在真正需要某个bean时才会创建它,启动快。
2.ApplicationContext
ApplicationContext是BeanFactory的子接口,提供了企业级的功能(事件发布、国际
化),是"高级版"的BeanFactory,采用预加载策略,在容器启动时就创建所有单例bean,
启动稍慢。
// BeanFactory 加载方式
Resource resource = new ClassPathResource("beans.xml");
BeanFactory factory = new XmlBeanFactory(resource);
MyBean myBean = (MyBean) factory.getBean("myBean"); // 此时才会创建myBean实例
// XmlBeanFactory构造器
public XmlBeanFactory(Resource resource, BeanFactory parentBeanFactory) throws BeansException {
super(parentBeanFactory);
// 这里只加载了资源
this.reader.loadBeanDefinitions(resource);
}
// ApplicationContext 加载方式
ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
MyBean myBean = context.getBean(MyBean.class); // 容器启动时就已经创建了所有单例bean
// ApplicationContext构造器
public ClassPathXmlApplicationContext(
String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
throws BeansException {
super(parent);
setConfigLocations(configLocations);
if (refresh) {
// 调用refresh方法,里面就会预加载
refresh();
}
}
5.BeanFactory核心子接口
1.HierarchicalBeanFactory
功能:
支持容器的层级结构,允许子容器访问父容器中的bean,但父容器不能访问子容器。
核心方法:
BeanFactory getParentBeanFactory():获取父容器
boolean containsLocalBean(String name):判断当前容器(不包含父容器)是否包含指定bean
应用场景:
多模块应用中,不同模块的 bean 可隔离管理,同时共享父容器的公共 bean
2.ListableBeanFactory
功能:
提供批量获取bean的能力,可枚举容器中的所有bean定义,解决BeanFactory只能逐个获取 bean 的局限。
核心方法:
String[] getBeanDefinitionNames():获取所有bean的名称
String[] getBeanNamesForType(Class<?> type):根据类型获取所有匹配的bean名称
<T> Map<String, T> getBeansOfType(Class<T> type):根据类型获取所有匹配的 bean(名称到实例的映射)
boolean containsBeanDefinition(String name):判断容器是否包含指定名称的bean定义(区别于 containsBean(),后者包括父容器)
应用场景:
需要批量处理 bean 时(如扫描特定类型的组件,如所有 @Service 注解的 bean)
应用场景:
自定义 BeanFactory 配置时使用(如扩展容器功能、注册自定义处理器)
3.AutowireCapableBeanFactory
功能:
扩展自动装配能力,允许容器外的对象参与 Spring 的依赖注入过程
核心方法:
Object autowire(Class<?> beanClass, int autowireMode, boolean dependencyCheck):根据类型或名称自动装配一个新实例
void autowireBean(Object existingBean):为已存在的对象自动注入依赖
Object configureBean(Object existingBean, String beanName):为已存在的对象应用Spring的bean配置(如初始化方法、AOP代理等)
应用场景:
整合非 Spring 管理的对象(如 Servlet、第三方框架创建的实例),使其享受依赖注入功能
4.ConfigurableBeanFactory
功能:
提供配置 BeanFactory 自身的能力,如设置类加载器、类型转换器、BeanPostProcessor 等
核心方法:
void setParentBeanFactory(BeanFactory parentBeanFactory):设置父容器(配合 HierarchicalBeanFactory)
void setBeanClassLoader(ClassLoader beanClassLoader):设置类加载器
void addBeanPostProcessor(BeanPostProcessor beanPostProcessor):注册bean后置处理器(用于bean初始化前后增强)
void destroySingletons():销毁所有单例bean(触发 DisposableBean 的 destroy() 方法)
应用场景:
自定义 BeanFactory 配置时使用(如扩展容器功能、注册自定义处理器)
5.ConfigurableListableBeanFactory
功能:
结合 ListableBeanFactory 和 ConfigurableBeanFactory 的功能,并提供解析和修改bean定义的能力
核心方法:
BeanDefinition getBeanDefinition(String beanName):获取指定bean 的定义信息(BeanDefinition 包含 bean 的类名、作用域、依赖等元数据)
void preInstantiateSingletons():提前实例化所有非延迟加载的单例bean(BeanFactory默认延迟初始化,此方法可强制提前初始化,如 ApplicationContext 的行为)
void ignoreDependencyType(Class<?> type):忽略指定类型的依赖注入(如Spring自身的BeanFactory类型不会被注入)
应用场景:
Spring 内部核心容器实现(如DefaultListableBeanFactory),用于解析配置文件(XML / 注解)并生成bean 定义,是大多数 IoC 容器的基础实现
6.BeanFactory核心实现类
1.DefaultListableBeanFactory
最核心的实现类,实现了ConfigurableListableBeanFactory等接口,支持XML、注解
等多种配置方式,是 ApplicationContext的底层容器
2.XmlBeanFactory(已过时)
基于XML配置的BeanFactory实现,现已被DefaultListableBeanFactory配合
XmlBeanDefinitionReader 替代
7.ApplicationContext核心子接口
1.ConfigurableApplicationContext
功能:
提供 ApplicationContext 的配置和生命周期管理能力,是所有可配置应用上下文的基础接口
核心方法:
void refresh():刷新容器(重新加载配置、创建所有bean),是容器初始化的核心方法
void close():关闭容器(释放资源、销毁单例bean)
void registerShutdownHook():注册JVM关闭钩子,确保容器在 JVM 退出时正常关闭
void addBeanFactoryPostProcessor(BeanFactoryPostProcessor postProcessor):注册 BeanFactoryPostProcessor(在bean定义加载后、实例化前修改配置)
应用场景:
Spring 内部用于容器的初始化和生命周期管理,如AbstractApplicationContext 是其主要实现类
2.WebApplicationContext
功能:
为 Web 应用提供的专用 ApplicationContext,整合了Servlet环境,能感知Web相关对象(如ServletContext)
核心方法:
ServletContext getServletContext():获取当前Web应用的ServletContext
String getNamespace():获取上下文的命名空间(用于区分多个Web上下文)
子接口扩展:
ConfigurableWebApplicationContext:提供 Web 环境下的容器配置能力,如 setServletContext(ServletContext)、setServletConfig(ServletConfig)
应用场景:
Spring MVC等Web框架中,作为Web层的IoC容器,与Servlet容器协同工作
3.AnnotationConfigApplicationContext
功能:
基于注解配置的ApplicationContext实现(严格来说是实现类,但常被视为注解驱动场景的核心接口代表),支持 @Configuration、@Component 等注解定义bean
核心方法:
register(Class<?>... annotatedClasses) 注册注解配置类
scan(String... basePackages) 扫描指定包下的注解bean
应用场景:
纯注解开发的 Spring 应用,替代 XML 配置,简化开发
8.ApplicationContext核心实现类
1.ClassPathXmlApplicationContext
从类路径加载 XML 配置文件初始化容器,适用于普通 Java 应用,示例:new ClassPathXmlApplicationContext("applicationContext.xml")
2.FileSystemXmlApplicationContext
从文件系统路径加载 XML 配置文件,适用于 XML 配置文件不在类路径下的场景
3.AnnotationConfigApplicationContext
基于注解配置的实现类,支持 @Configuration 和组件扫描,是现代 Spring 开发的首选
4.XmlWebApplicationContext
Web 环境下基于 XML 配置的容器,是 Spring MVC 的默认容器实现
5.AnnotationConfigWebApplicationContext
Web 环境下基于注解配置的容器,适用于 Spring Boot 或纯注解的 Web 应用
9.Spring容器构建流程

10.Spring Bean生命周期

11.写在最后
以上核心的接口、实现类及流程图,建议记住。后续在分析细节源码时大家一定要站在全局的视角去分析源码细节工作,具体执行到总体的哪一步流程。
451

被折叠的 条评论
为什么被折叠?



