高频面试题:bean的生命周期

在Spring框架中,bean的生命周期由Spring容器管理。Spring提供了一系列的接口和回调方法,允许你在bean的生命周期中的特定阶段执行自定义逻辑。以下是Spring中管理bean生命周期的主要步骤和接口:

1. 实例化Bean

Spring容器首先会使用bean的构造函数或工厂方法创建bean的实例。

2. 属性赋值

在bean实例化之后,Spring容器会注入配置的属性值,这些值来自XML配置、注解或Java配置类。

3. BeanNameAwareBeanFactoryAwareApplicationContextAware 接口

  • BeanNameAware: 如果bean实现了BeanNameAware接口,Spring容器会调用setBeanName方法,传入bean的名称。
  • BeanFactoryAware: 如果bean实现了BeanFactoryAware接口,Spring容器会调用setBeanFactory方法,传入BeanFactory实例。
  • ApplicationContextAware: 如果bean实现了ApplicationContextAware接口,Spring容器会调用setApplicationContext方法,传入ApplicationContext实例。

4. InitializingBean 接口

如果bean实现了InitializingBean接口,Spring容器会调用afterPropertiesSet方法。这是一个在所有属性设置之后执行自定义初始化逻辑的好地方。

5. init-method 配置

你可以在XML配置中为bean指定一个init-method,该方法会在属性设置之后被调用。

6. @PostConstruct 注解

如果bean使用了JSR-250注解,Spring容器会在属性设置之后调用用@PostConstruct注解标记的方法。

7. 使用中的bean

此时,bean已经准备好被应用程序使用了,可以从Spring容器中获取并注入到其他bean中。

8. DisposableBean 接口

在容器关闭之前,如果bean实现了DisposableBean接口,Spring容器会调用destroy方法。

9. destroy-method 配置

你可以在XML配置中为bean指定一个destroy-method,该方法会在容器关闭bean之前被调用。

10. @PreDestroy 注解

如果bean使用了JSR-250注解,Spring容器会在容器关闭bean之前调用用@PreDestroy注解标记的方法。

以下是如何在Java配置中使用这些接口和注解的示例:

java 复制代码
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;

@Component
@Scope("singleton")
public class MyBean implements InitializingBean, DisposableBean {

    public MyBean() {
        // 构造函数
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // 在属性设置之后执行的初始化逻辑
        System.out.println("MyBean is initialized");
    }

    @PostConstruct
    public void init() {
        // 在属性设置之后执行的初始化逻辑
        System.out.println("MyBean post-construct");
    }

    @Override
    public void destroy() throws Exception {
        // 在容器关闭之前执行的销毁逻辑
        System.out.println("MyBean is destroyed");
    }

    @PreDestroy
    public void cleanup() {
        // 在容器关闭之前执行的销毁逻辑
        System.out.println("MyBean pre-destroy");
    }
}

通过实现这些接口和使用注解,你可以控制Spring容器管理的bean的生命周期中的特定阶段。

相关推荐
励志不掉头发的内向程序员6 分钟前
STL库——string(类函数学习)
开发语言·c++
一百天成为python专家34 分钟前
Python循环语句 从入门到精通
开发语言·人工智能·python·opencv·支持向量机·计算机视觉
Sunhen_Qiletian37 分钟前
朝花夕拾(五)--------Python 中函数、库及接口的详解
开发语言·python
hqwest1 小时前
C#WPF实战出真汁07--【系统设置】--菜品类型设置
开发语言·c#·wpf·grid设计·stackpanel布局
前路不黑暗@1 小时前
C语言:操作符详解(二)
c语言·开发语言·经验分享·笔记·学习·学习方法·visual studio
柳贯一(逆流河版)1 小时前
Spring 三级缓存:破解循环依赖的底层密码
java·spring·缓存·bean的循环依赖
深盾科技2 小时前
Kotlin Data Classes 快速上手
android·开发语言·kotlin
zzywxc7872 小时前
详细探讨AI在金融、医疗、教育和制造业四大领域的具体落地案例,并通过代码、流程图、Prompt示例和图表等方式展示这些应用的实际效果。
开发语言·javascript·人工智能·深度学习·金融·prompt·流程图
浮灯Foden2 小时前
算法-每日一题(DAY13)两数之和
开发语言·数据结构·c++·算法·leetcode·面试·散列表
淡海水3 小时前
【原理】Struct 和 Class 辨析
开发语言·c++·c#·struct·class