1. XML解析(Parsing)------ "读黄书阶段"
- Spring先他妈把XML当黄书一样从头翻到尾,找到所有
<bean>
标签。 - 解析器(比如
BeanDefinitionReader
)把每个bean的类名、ID、属性、依赖关系 全扒出来,生成一堆BeanDefinition
(相当于bean的身份证+简历)。 - 核心点:XML不是代码,但Spring能把它当菜谱,知道要炒什么菜(对象)。
2. 校验(Validation)------ "查户口阶段"
- 检查你写的XML是不是脑残:比如类路径对不对,属性有没有拼错,循环依赖这种作死操作。
- 这时候要是有个
class="com.xxx.NotExistClass"
,直接喷你一脸BeanDefinitionStoreException
。 - 核心点:提前发现傻逼错误,防止运行时炸屎。
3. 实例化(Instantiation)------ "造人阶段"
- 用反射 (反射就是Java的巫术)
Class.forName()
+newInstance()
,把类硬生生搞出对象。 - 如果是单例,这时候对象还是个空壳(属性没填,像被阉了的狗)。
- 核心点:无脑new对象,但Spring帮你new,你躺好就行。
4. 初始化(Initialization)------ "填弹药阶段"
- 依赖注入(DI):把对象需要的其他bean(比如DAO、Service)用setter或构造函数怼进去,就像给炮管塞炮弹。
- BeanPostProcessor插一腿:AOP代理、@Autowired注解这些骚操作,全在这时候搞(比如给你的对象套一层动态代理,变成老六)。
- 如果bean实现了
InitializingBean
,会执行afterPropertiesSet()
,让你自定义初始化(比如连数据库)。 - 核心点:把对象武装到牙齿,让它能干活。
5. 销毁(Destruction)------ "送终阶段"
- 容器关闭时(比如
context.close()
),单例bean要凉凉。 - 如果bean实现了
DisposableBean
,会调用destroy()
,让你死前做点事(比如关数据库连接,喊一句"妈的终于下班了")。 - 核心点:管杀还管埋,避免资源泄露(比如连接池不关,内存炸穿)。
总结流程 :
读配置 → 查错误 → 造空壳 → 塞依赖 → 搞代理 → 自定义初始化 → 用完了再毁尸灭迹
整个过程像他妈流水线------你写XML/注解,Spring流水线工人(容器)给你拼装对象,最后还给你擦屁股。
灵魂 :控制反转(IoC)就是把对象的生老病死交给Spring,你自己只管声明要什么,而不是亲自当接生婆!