1. Spring Bean实例化流程深度解析
Spring框架的核心机制之一就是IoC容器对Bean的管理。很多开发者虽然每天都在使用Spring,但对Bean实例化的完整流程却知之甚少。今天我将结合源码和实际案例,带大家彻底搞懂Spring Bean从配置到实例化的完整生命周期。
在传统的Java开发中,对象创建和依赖管理都需要开发者手动完成。而Spring通过BeanDefinition和三级缓存等机制,实现了对象的自动化管理和依赖注入。理解这个流程不仅能帮助我们更好地使用Spring,还能在遇到问题时快速定位原因。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Bean实例化核心流程拆解
2.1 BeanDefinition的加载与注册
Spring容器启动时,首先会读取配置文件(XML或注解),将每个<bean>配置解析成BeanDefinition对象。这个过程就像建筑师根据图纸准备施工方案一样,BeanDefinition就是Spring创建Bean的"施工图纸"。
java复制// 典型配置示例
<bean id="userService" class="com.example.UserServiceImpl">
<property name="userDao" ref="userDao"/>
</bean>
这个配置会被解析为:
- beanName: "userService"
- className: "com.example.UserServiceImpl"
- propertyValues: 包含userDao的引用
这些BeanDefinition会被注册到DefaultListableBeanFactory的beanDefinitionMap中。我们可以通过以下代码验证:
java复制DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory();
XmlBeanDefinitionReader reader = new XmlBeanDefinitionReader(beanFactory);
reader.loadBeanDefinitions("applicationContext.xml");
// 获取BeanDefinition
BeanDefinition bd = beanFactory.getBeanDefinition("userService");
System.out.println(bd.getPropertyValues()); // 查看属性值
实际开发中,Spring Boot通常使用注解方式配置Bean,但底层原理相同,只是配置形式不同
2.2 Bean实例化的触发时机
Spring Bean的实例化时机分为两种:
- 预实例化(默认单例模式):容器启动时立即创建
- 延迟初始化(@Lazy):第一次使用时才创建
对于单例Bean,Spring会在AbstractApplicationContext的refresh()方法中触发预实例化:
java复制// Abst
