Bean的生命周期

1️⃣** 初始化容器**
ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
ApplicationContext是BeanFactory的子接口;- 它在启动(
refresh())时会完成 配置加载 + Bean 注册 + Bean 实例化; - 这是一个预加载容器(启动即创建 Bean)。
⚠️ 与之相对的 BeanFactory 是延迟加载容器,只有在第一次调用 getBean() 时才会创建对象。
2️⃣** 解析配置并生成 BeanDefinition**
Spring 首先会读取配置文件(如 XML 或注解),解析 <bean> 标签中的定义,例如:
<bean id="myBean" class="com.example.MyBean" scope="singleton"/>
这些信息会被封装成 BeanDefinition 对象,描述 Bean 的元数据,包括:
| 属性 | 说明 |
| id | Bean 的唯一名称 |
| class | Bean 的全类名 |
| scope | 作用域(singleton / prototype) |
| constructor args / properties | 依赖信息 |
BeanDefinition 不是 Bean 实例,而是告诉容器“如何创建 Bean”的蓝图。
3️⃣** 注册 BeanDefinition**
Spring 将所有的 BeanDefinition 注册到一个全局的注册表中:
Map<String, BeanDefinition> beanDefinitionMap = new ConcurrentHashMap<>();
beanDefinitionMap.put("myBean", BeanDefinition@1234);
📘 这一步只完成定义注册,还没有实例化对象。
当容器启动(ApplicationContext)或首次 getBean()(BeanFactory)时,Spring 开始真正创建对象。
无论触发方式如何,最终都会进入相同的调用链:
MyBean bean = ctx.getBean("myBean");
getBean()
└── doGetBean()
├── getSingleton() // 从缓存中查找是否已创建
├── createBean() // 未创建则进入创建流程
│ ├── createBeanInstance() // 反射实例化对象
│ ├── populateBean() // 依赖注入
│ └── initializeBean() // 初始化回调
└── addSingleton() // 放入缓存池
1️⃣** createBeanInstance():反射创建对象**
Class<?> clazz = Class.forName(beanDefinition.getBeanClassName());
Object bean = clazz.getDeclaredConstructor().newInstance();
2️⃣** populateBean():执行依赖注入**
Spring 会根据 BeanDefinition 或注解信息完成依赖注入。
常见的三种方式:
| 注入方式 | 示例 | 实现方式 |
|---|---|---|
| 构造器注入 | <constructor-arg> | 反射调用构造器 |
| Setter 注入 | <property> | 反射调用 setter 方法 |
| 字段注入 | @Autowired/ @Resource | 反射直接设置字段值 |
示例:
@Component
public class MyBean {
@Autowired
private MyService myService;
}
3️⃣** initializeBean():初始化与回调**
依赖注入完成后,Spring 会执行初始化回调,包含:
1.调用 BeanNameAware、ApplicationContextAware 等接口;
2.执行 InitializingBean.afterPropertiesSet();
3.调用 init-method;
4.触发 BeanPostProcessor(如 AOP 代理增强)。
4️⃣** addSingleton():放入单例缓存**
当 Bean 完全创建完毕后,Spring 会将其放入一级缓存:
singletonObjects.put(beanName, bean);
这样之后再次 getBean("myBean"),会直接从缓存中取,不再重新创建。
1️⃣ 读取配置文件或扫描注解
↓
2️⃣ 生成 BeanDefinition(Bean 蓝图)
↓
3️⃣ 注册到 beanDefinitionMap(定义注册)
↓
4️⃣ 调用 getBean() 或 容器启动触发创建
↓
5️⃣ createBean() → 反射创建对象
↓
6️⃣ populateBean() → 执行依赖注入
↓
7️⃣ initializeBean() → 初始化与增强
↓
8️⃣ addSingleton() → 缓存单例 Bean
↓
9️⃣ 返回 Bean 实例
说说BeanFactory和ApplicantContext?
可以这么形容,BeanFactory是Spring的“心脏”,ApplicantContext是完整的“身躯”。
BeanFactory(Bean工厂)是Spring框架的基础设施,面向Spring本身。
ApplicantContext(应用上下文)建立在BeanFactoty基础上,面向使用Spring框架的开发者。
Spring为BeanFactory提供了很多种实现,最常用的是XmlBeanFactory,但在Spring3.2中已被废弃,建议使用XmlBeanDefinitionReader、DefaultListableBeanFactory。

BeanFactory接口位于类结构树的顶端,它最主要的方法就是getBean(String var1),这个方法从容器中返回特定名称的Bean。
BeanFactory的功能通过其它的接口得到了不断的扩展,比如AbstractAutowireCapableBeanFactory定义了将容器中的Bean按照某种规则(比如按名字匹配、按类型匹配等)进行自动装配的方法。
这里看一个 XMLBeanFactory(已过期) 获取bean 的例子:

ApplicationContext 接口
ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。可以这么说,使用BeanFactory就是手动档,使用ApplicationContext就是自动档。

ApplicationContext 继承了HierachicalBeanFactory和ListableBeanFactory接口,在此基础上,还通过其他的接口扩展了ApplicationContext的功能,包括:
Bean instantiation/wiring
Bean 的实例化/串联
自动的 BeanPostProcessor 注册
自动的 BeanFactoryPostProcessor 注册
方便的 MessageSource 访问(i18n)
ApplicationEvent 的发布与 BeanFactory 懒加载的方式不同,它是预加载,所以,每一个 bean 都在 ApplicationContext 启动之后实例化
这是 ApplicationContext 的使用例子:

ApplicationContext 包含 BeanFactory 的所有特性,通常推荐使用前者。
如果我的内容对你有帮助,请辛苦动动您的手指为我点赞,评论,收藏。感谢大家!!
AI大模型学习福利
作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。
一、全套AGI大模型学习路线
AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获取
二、640套AI大模型报告合集
这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
三、AI大模型经典PDF籍
随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
四、AI大模型商业化落地方案

因篇幅有限,仅展示部分资料,需要点击文章最下方名片即可前往获
作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量
961

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



