在 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 对象的创建、初始化和销毁过程,以确保它们在应用程序中的正确管理和运行。
领取专属 10元无门槛券
私享最新 技术干货