当前位置: 首页 > news >正文

Spring生命周期都有哪些阶段

Spring Bean 的生命周期:
创建(实例化)—初始化(初始化前,初始化,初始化后)—就绪并可用—销毁(销毁前,销毁,销毁后)
以下为你详细介绍这些阶段及其作用。

1. 实例化(Instantiation)

  • 描述:这是 Spring Bean 生命周期的起始点,Spring 容器根据 Bean 的定义信息,利用反射机制调用 Bean 类的构造函数来创建 Bean 的实例。此阶段只是在内存中分配了对象的空间,还未对其属性进行赋值。
  • 示例
// 定义一个简单的 Bean 类
public class MyBean {
    public MyBean() {
        System.out.println("MyBean 实例化");
    }
}

2. 属性赋值(Populate Properties)

  • 描述:在 Bean 实例创建完成后,Spring 容器会根据 Bean 的定义信息,将依赖的其他 Bean 或属性值注入到该 Bean 中。可以通过构造函数注入、Setter 方法注入或字段注入等方式实现。
  • 示例(Setter 方法注入)
public class MyBean {
    private AnotherBean anotherBean;

    public void setAnotherBean(AnotherBean anotherBean) {
        this.anotherBean = anotherBean;
        System.out.println("MyBean 属性赋值");
    }
}

3. 初始化前(Initialization - Before)

  • 描述:此阶段会调用 BeanPostProcessorpostProcessBeforeInitialization 方法。BeanPostProcessor 是 Spring 提供的一个扩展点,允许开发者在 Bean 初始化前后进行自定义处理。可以在这个方法中对 Bean 进行额外的处理,如修改 Bean 的属性等。
  • 示例
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;

public class MyBeanPostProcessor implements BeanPostProcessor {
    @Override
    public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
        System.out.println("MyBean 初始化前处理,Bean 名称: " + beanName);
        return bean;
    }

    @Override
    public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
        return bean;
    }
}

4. 初始化(Initialization)

4.1 实现 InitializingBean 接口
  • 描述:如果 Bean 实现了 InitializingBean 接口,Spring 容器会调用其 afterPropertiesSet 方法。该方法通常用于在 Bean 的属性注入完成后进行一些初始化操作。
  • 示例
import org.springframework.beans.factory.InitializingBean;

public class MyBean implements InitializingBean {
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("MyBean 实现 InitializingBean 接口的初始化方法调用");
    }
}
4.2 自定义初始化方法
  • 描述:可以通过在 Bean 定义中指定自定义的初始化方法,Spring 容器会在 Bean 的属性注入完成后调用该方法。
  • 示例(Java 配置)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean(initMethod = "customInit")
    public MyBean myBean() {
        return new MyBean();
    }
}

public class MyBean {
    public void customInit() {
        System.out.println("MyBean 自定义初始化方法调用");
    }
}

5. 初始化后(Initialization - After)

  • 描述:此阶段会调用 BeanPostProcessorpostProcessAfterInitialization 方法。同样是利用 BeanPostProcessor 这个扩展点,开发者可以在 Bean 初始化完成后进行自定义处理,如对 Bean 进行代理包装等。
  • 示例:参考初始化前阶段的 MyBeanPostProcessor 类。

6. 就绪并可使用(Ready to Use)

  • 描述:经过上述步骤后,Bean 已经完成了初始化过程,处于就绪状态,可以被应用程序使用。此时,应用程序可以通过 Spring 容器获取该 Bean 并调用其方法。

7. 销毁前(Destruction - Before)

  • 描述:当 Spring 容器关闭时,在销毁 Bean 之前,如果有相关的销毁前处理器,会执行相应的操作。不过这不是 Spring 标准生命周期中默认的阶段,可能需要开发者自定义实现。

8. 销毁(Destruction)

8.1 实现 DisposableBean 接口
  • 描述:如果 Bean 实现了 DisposableBean 接口,Spring 容器会调用其 destroy 方法。该方法通常用于在 Bean 销毁前进行一些资源释放操作,如关闭数据库连接、释放文件句柄等。
  • 示例
import org.springframework.beans.factory.DisposableBean;

public class MyBean implements DisposableBean {
    @Override
    public void destroy() throws Exception {
        System.out.println("MyBean 实现 DisposableBean 接口的销毁方法调用");
    }
}
8.2 自定义销毁方法
  • 描述:可以通过在 Bean 定义中指定自定义的销毁方法,Spring 容器会在关闭时调用该方法。
  • 示例(Java 配置)
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class AppConfig {
    @Bean(destroyMethod = "customDestroy")
    public MyBean myBean() {
        return new MyBean();
    }
}

public class MyBean {
    public void customDestroy() {
        System.out.println("MyBean 自定义销毁方法调用");
    }
}

9. 销毁后(Destruction - After)

  • 描述:Bean 经过销毁操作后,实例被销毁,其所占用的资源被释放,不再可用。

综上所述,Spring Bean 的生命周期涵盖了从创建到销毁的多个阶段,开发者可以通过实现特定的接口或指定自定义方法来控制 Bean 的初始化和销毁过程,以满足不同的业务需求。

相关文章:

  • k8s命名空间和资源配额
  • redis 与 DB 的一致性 7 种策略
  • 软考教材重点内容 信息安全工程师 第18章 网络安全测评技术与标准
  • 【C语言】高内聚低耦合:结构体、联合体、数组、字符串、枚举和指针的综合实践
  • 显式 GC 的使用:留与去,如何选择?
  • [RN]React Native知识框架图详解
  • GPU架构分类
  • win11远程桌面连接报错(出现身份验证错误。要求的函数不受支持。可能是CredSSP 加密数据库修正)的解决办法整理
  • 左值引用与指针的区别
  • rpc学习
  • 网络安全系统分为几级_网络安全系统的分级与软考要点解析
  • 解决样式隔离的方法
  • Live2d官方项目运行
  • c++头文件和命名空间
  • 在线量化算法(QAT) --学习记录1
  • Android 常见View的防抖
  • NO.19十六届蓝桥杯模拟赛第三期上
  • 【Wireshark 02】抓包过滤方法
  • Orfeo Toolbox (OTB):开源的遥感数据处理工具箱/QGIS插件
  • DeepSeek 助力 Vue3 开发:打造丝滑的弹性布局(Flexbox)
  • hbuilder制作网页代码/seo包年优化
  • 用wordpress做的网站有哪些/头条收录提交入口
  • 做网站接广告赚钱么/2022最新永久地域网名
  • 河北网站制作公司哪家好/苹果aso优化
  • 网站做跳转会有什么影响/百度统计数据分析
  • 公司网站建设费用/百度网盘网页版登录入口官网