Spring Bean生命周期

1. Bean定义加载与解析

  • 过程:Spring容器读取配置文件或扫描注解(如@Component),将Bean的定义(如类名、作用域、初始化/销毁方法等)加载到BeanDefinition

  • 扩展点:无直接扩展,但可通过@ComponentScan或XML配置影响Bean的发现。

2. BeanFactoryPostProcessor 处理

  • 过程:在Bean实例化前,允许修改Bean的定义(如属性占位符替换${})。

  • 扩展点:实现BeanFactoryPostProcessor接口,例如PropertySourcesPlaceholderConfigurer

3. Bean实例化

  • 过程:通过构造函数或工厂方法创建Bean的实例(此时对象尚未初始化)。

  • 扩展点:可通过@Scope指定作用域(如singletonprototype)。

4. 属性注入(依赖注入)

  • 过程:根据@Autowired@Resource或XML配置,注入依赖的属性和Bean。

  • 扩展点:使用@Autowired@Value等注解自定义注入逻辑。

5. Aware接口回调

  • 过程:若Bean实现了Aware接口,容器会回调相关方法注入上下文信息。

  • 关键接口

    • BeanNameAware:注入Bean的名称。

    • BeanFactoryAware:注入BeanFactory实例。

    • ApplicationContextAware:注入ApplicationContext(此时Bean还未初始化)。

6. BeanPostProcessor 前置处理

  • 过程:执行所有BeanPostProcessorpostProcessBeforeInitialization()方法。

  • 典型应用AOP代理的生成(如AbstractAutoProxyCreator)。

7. 初始化阶段

  • 执行顺序

    1. @PostConstruct注解方法:JSR-250标准,最先执行。

    2. InitializingBean接口的afterPropertiesSet():Spring特定接口。

    3. 自定义init-method:通过XML或@Bean(initMethod="...")指定。

8. BeanPostProcessor 后置处理

  • 过程:执行所有BeanPostProcessorpostProcessAfterInitialization()方法。

  • 典型应用:增强Bean(如生成代理对象)。

9. Bean就绪

  • 过程:Bean完全初始化,可被应用程序使用。

10. 销毁阶段(容器关闭时)

  • 执行顺序

    1. @PreDestroy注解方法:JSR-250标准,最先执行。

    2. DisposableBean接口的destroy():Spring特定接口。

    3. 自定义destroy-method:通过XML或@Bean(destroyMethod="...")指定。

注意事项

  1. 作用域影响

    • singleton Bean会完整经历生命周期。

    • prototype Bean不会执行销毁方法(需手动清理)。

  2. 循环依赖:通过三级缓存解决,但可能影响初始化顺序。

  3. 扩展点优先级BeanPostProcessor > @PostConstruct > InitializingBean > init-method

你可能感兴趣的:(#,Spring原理篇,spring,java,后端)