首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Spring框架Bean生命周期的5个阶段及举例说明

在 Spring 中,Bean 的生命周期指的是一个对象从创建实例到销毁实例的整个过程,包括初始化和销毁阶段。Spring IoC容器管理 Bean 的生命周期,允许开发者在不同的生命周期阶段插入自定义的处理逻辑。

一、Spring Bean生命周期的5个阶段

实例化(Instantiation)

Spring IoC容器会实例化 Bean 对象,为 Bean 分配内存空间。

在容器启动时,根据配置信息或注解创建 Bean 实例。

属性设置(Properties Set)

在 Bean 实例化之后,Spring 容器会注入依赖项和设置属性。

这包括通过构造函数注入、Setter 方法注入或字段注入/依赖注入等方式来设置 Bean 的属性。

初始化(Initialization)

在属性设置完成后,Spring 容器会调用 Bean 的初始化回调方法来执行一些定制的初始化操作。

这些初始化回调方法可以是通过实现 InitializingBean 接口的 afterPropertiesSet() 方法,或通过在配置中指定的自定义初始化方法,或通过@PostConstruct注解的方法来实现。

在此阶段,我们可以执行任何必要的初始化任务。

使用(In Use)

在初始化完成后,Bean 就可以被应用程序使用了。

它们在容器中处于活动状态,并且可以被其他 Bean 或组件引用和调用。

销毁(Destruction)

当应用程序关闭或者通过 Spring API 显式地销毁 Bean 时,Spring 容器会调用 Bean 的销毁方法。

这可以是通过实现 DisposableBean 接口的 destroy() 方法,或通过在配置中指定的自定义销毁方法来实现。

在此阶段,您可以执行任何必要的清理任务,如释放资源或关闭连接。

二、Spring生命周期案例演示

1、使用@Configuration + @Bean的方式演示Bean的生命周期

第一步,创建一个简单的bean

public class MyBean{ // 2、设置属性值 @Value("${spring.tel}") private String tel; // 无参构造函数 public MyBean() { System.out.println("1、实例化 MyBean,属性 tel = " + tel); } @PostConstruct public void init2(){ System.out.println("3、MyBean @PostConstruct 初始化方法,属性tel = " + tel); } public void init(){ System.out.println("3、MyBean 初始化方法"); } public void fun(){ System.out.println("4、调用 MyBean 的 fun 方法"); } public void destroy(){ System.out.println("5、MyBean 销毁方法");}}

第二步,声明配置文件

@Configurationpublic class MyConfig{ // 实例化一个bean,destroyMethod默认执行close/shutdown方法 @Bean(initMethod="init",destroyMethod="destroy") public MyBean myBean() { return new MyBean();}}

第三步,测试代码

import javax.annotation.PostConstruct;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;/***?Bean生命周期演示代码*/@SpringBootApplicationpublic class SpringApp3 { public static void main(String[] args) { ConfigurableApplicationContext context = SpringApplication.run(SpringApp.class, args); // 通过class获取bean实例 MyBean myBean = context.getBean(MyBean.class); myBean.fun(); // 关闭上下文,调用销毁方法 context.close(); }}

运行结果:

上面的演示代码涵盖了一个bean的整个生命周期,在MyBean对象中,设置了一个属性并且从配置文件中获取,在实例化的时候,属性并未被设置,打印结果为null,第二步是属性设置,在第三步初始化的时候属性就有值了。

另外使用@PostConstruct注解的初始化方法要比配置文件中标注的初始化方法早一步执行。

与 @PostConstruct 对应的还有 @PreDestroy 销毁方法,可以加上去看看它的执行顺序。

2、使用@Component演示一个bean的生命周期

首先,创建一个简单的bean

@Componentpublic class?MyBean2?implements?InitializingBean,?DisposableBean?{//?无参构造函数 public MyBean2() { System.out.println("1、实例化 MyBean2"); } @Value("${spring.tel}") public void setTel(String tel){ System.out.println("2、属性设置 tel=" + tel); } @PostConstruct public void init(){ System.out.println("3、MyBean2 @PostConstruct 初始化方法"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("3、MyBean2 InitializingBean afterPropertiesSet 初始化方法"); } public void fun(){ System.out.println("4、调用 MyBean2 的 fun 方法"); } @Override public void destroy() throws Exception { System.out.println("5、MyBean2 DisposableBean 销毁方法");}}

这个bean实现了 InitializingBean 初始化接口和 DisposableBean 销毁接口。

然后,测试代码:

import javax.annotation.PostConstruct;import org.springframework.beans.factory.DisposableBean;import org.springframework.beans.factory.InitializingBean;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import org.springframework.context.ConfigurableApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.stereotype.Component;/*** Bean生命周期演示代码*/@SpringBootApplicationpublic class SpringApp3 { public static void main(String[] args) {

ConfigurableApplicationContext context = SpringApplication.run(SpringApp.class, args); ???//?通过class获取bean实例 MyBean2 myBean2 = context.getBean(MyBean2.class); myBean2.fun(); // 关闭上下文,调用销毁方法 context.close();

}}

运行结果:

运行结果和示例一样,严格遵守了Bean的生命周期顺序。

三、最后总结

Bean生命周期划分为五大步:第一步:实例化Bean;第二步:Bean属性赋值,依赖注入;第三步:初始化Bean;第四步:使用Bean;第五步:销毁Bean。

实例化和初始化是两个完全不同的过程,实例化只是给 Bean分配了内存空间,而初始化则是将程序的执行权,从系统级别转换到用户级别,并开始执行用户添加的业务代码。

通过这些生命周期阶段,Spring 提供了灵活的机制来管理 Bean 对象的创建、初始化和销毁过程,以确保它们在应用程序中的正确管理和运行。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/O96rY0nKHCYbn__S-lhhPYWw0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券
http://www.vxiaotou.com