Spring-Beans的生命周期的介绍

目录

1、Spring核心组件

2、Bean组件

2.1、Bean的定义

2.2、Bean的生命周期

1、实例化

2、属性填充

3、初始化

4、销毁

2.3、Bean的执行时间

2.4、Bean的作用域

3、常见问题解决方案

4、与Java对象区别


前言

关于bean的生命周期,如下所示:

之前文章介绍Spring的核心模块,可参考:Spring的核心模块原理介绍_spring 原理-CSDN博客


1、Spring核心组件

spring的核心组件由容器层、测试层、数据链接层、web层、AOP、Aspects等组成。

而容器层里面有四个组件,分别是beans,context、core、expression language。

如下图所示、

2、Bean组件

对于spring-beans,由bean的定义,注入方式、生命周期和作用域四种组成。

2.1、Bean的定义

1.BeanDefinition(Bean定义抽象)

代码如下图所示:

java 复制代码
public interface BeanDefinition {
    String getBeanClassName();
    String getScope();
    boolean isSingleton();
    boolean isLazyInit();
    // 其他元数据访问方法...
}

关于bean定义信息如下图所示:

2.2、Bean的生命周期

Spring Bean 的生命周期指的是一个 Bean 从创建到销毁的整个过程,可以按照container容器,bean,aware三个组件进行介绍。

如下图所示:

关于每个阶段需要执行的流程,如下图所示:

由上图可知,分为四个阶段

1、实例化

2、属性填充

如何解决三级缓存的问题,可参考:Spring容器三级缓存介绍_三级缓存spring-CSDN博客

关于三级缓存就发生在属性填充阶段。

3、初始化

分为aware回调函数和初始化回调。

1、aware回调。

2、初始化回调包括初始化前、初始化、初始化后阶段,分别由BeanPostProcessor类进行调用。

动态代理也发生在初始化阶段。

4、销毁

当使用完成后,会进行销毁阶段。

代码如下所示:

java 复制代码
public  class destroyBeanTest implements DisposableBean {
    @Override
    public void destroy() throws Exception {
        
    }
}

关于整个bean的执行流程顺序的代码示例:

java 复制代码
public class LifecycleBean implements BeanNameAware, InitializingBean, DisposableBean {
    
    private String name;
    
    // 1. 构造函数
    public LifecycleBean() {
        System.out.println("1. 构造函数执行");
    }
    
    // 2. 属性注入
    public void setName(String name) {
        System.out.println("2. 属性注入: " + name);
        this.name = name;
    }
    
    // 3. BeanNameAware
    @Override
    public void setBeanName(String name) {
        System.out.println("3. BeanNameAware: " + name);
    }
    
    // 4. @PostConstruct
    @PostConstruct
    public void postConstruct() {
        System.out.println("4. @PostConstruct方法");
    }
    
    // 5. InitializingBean
    @Override
    public void afterPropertiesSet() {
        System.out.println("5. afterPropertiesSet()");
    }
    
    // 6. 自定义init方法
    public void customInit() {
        System.out.println("6. 自定义init-method");
    }
    
    // 7. @PreDestroy
    @PreDestroy
    public void preDestroy() {
        System.out.println("7. @PreDestroy方法");
    }
    
    // 8. DisposableBean
    @Override
    public void destroy() {
        System.out.println("8. destroy()");
    }
    
    // 9. 自定义destroy方法
    public void customDestroy() {
        System.out.println("9. 自定义destroy-method");
    }
}

2.3、Bean的执行时间

实例化、属性填充、初始化三个阶段在IOC容器加载的时候去执行的,销毁在spring容器关闭的时候,才会执行。

2.4、Bean的作用域

bean在被Spring容器装配时,作用域(Scope)分为singleton、prototype、request、session,其中request和session适用于WebApplicationContext环境。

1、singleton

单例模式,Spring的容器中只有一个实例,有Spring容器创建,创建时间点,分为启动创建和延迟加载,根据bean对象配置的属性lazy-init属性决定,默认为false,配置为true时,会在第一次调用时创建该对象。

2、prototype

非单例模式,每次从Spring容器中调用时,都返回一个新实例。创建bean对象的时间点为bean被调用时。所以都是lazy-init。

3、request

每次request请求都会创建一个新的bean。

4、session

同一个session共享一个bean。

3、常见问题解决方案

  1. 循环依赖

    • 重构设计,避免循环依赖

    • 使用@Lazy延迟加载一方

    • 改用setter/field注入

  2. Bean覆盖

    • 使用@Primary指定主候选Bean

    • 通过@Qualifier明确指定Bean

    • 合理命名Bean(避免自动装配歧义)

  3. 生命周期异常

    • 确保@PostConstruct方法轻量

    • 避免在初始化阶段依赖未准备好的Bean

    • 正确处理原型作用域Bean的资源释放


4、与Java对象区别


总结

Spring Bean 机制是 Spring 框架的基石,通过理解其工作原理,可以更好地利用 Spring 的强大功能,构建松耦合、易测试、可维护的应用程序。


总结

1、Spring官网阅读(十)Spring中Bean的生命周期(下)_applybeanpost-CSDN博客

相关推荐
Hellyc3 小时前
基于模板设计模式开发优惠券推送功能以及对过期优惠卷进行定时清理
java·数据库·设计模式·rocketmq
lifallen3 小时前
Paimon LSM Tree Compaction 策略
java·大数据·数据结构·数据库·算法·lsm-tree
hdsoft_huge3 小时前
SpringBoot 与 JPA 整合全解析:架构优势、应用场景、集成指南与最佳实践
java·spring boot·架构
百锦再4 小时前
详细解析 .NET 依赖注入的三种生命周期模式
java·开发语言·.net·di·注入·模式·依赖
程序员的世界你不懂4 小时前
基于Java+Maven+Testng+Selenium+Log4j+Allure+Jenkins搭建一个WebUI自动化框架(2)对框架加入业务逻辑层
java·selenium·maven
风吹落叶花飘荡4 小时前
2025 Next.js项目提前编译并在服务器
服务器·开发语言·javascript
失败又激情的man5 小时前
python之requests库解析
开发语言·爬虫·python
专注VB编程开发20年5 小时前
常见 HTTP 方法的成功状态码200,204,202,201
开发语言·网络协议·tcp/ip·http
有没有没有重复的名字5 小时前
线程安全的单例模式与读者写者问题
java·开发语言·单例模式
开开心心_Every6 小时前
便捷的电脑自动关机辅助工具
开发语言·人工智能·pdf·c#·电脑·音视频·sublime text