面试题积累-Spring-bean的生命周期

本文深入探讨Spring框架中Bean的生命周期,包括实例化、初始化、使用和销毁阶段,以及singleton、prototype、request、session和globalsession五种作用域的特点与应用场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在我的面试经验中,这个是必问的问题,几乎每家公司都会问一下这个。
答不上来基本没戏!
基本生命周期就如下图所示了:
在这里插入图片描述

如果还想详细一点如下:

  1. Spring支持五个作用域:singleton、prototype、request、session、global session

    • singleton :默认的作用域 spring IoC容器仅存在一个Bean实例,Bean以单例方式存在,在创建起容器时就同时自动创建了一个bean的对象
    • prototype:每次从容器中调用Bean时,都返回一个新的实例,即每次调用getBean()时,相当于执行newXxxBean()。Prototype是原型类型,它在我们创建容器的时候并没有实例化,而是当我们获取bean的时候才会去创建一个对象,而且我们每次获取到的对象都不是同一个对象
    • request:每次HTTP请求都会创建一个新的Bean,该作用域仅适用于WebApplicationContext环境
    • session:同一个HTTP Session共享一个Bean,不同Session使用不同的Bean,仅适用于WebApplicationContext环境
    • global-session:一般用于Portlet应用环境,该运用域仅适用于WebApplicationContext环境
  2. 生命周期:

    • 简单点说就是:bean的实例化–>bean的初始化–>bean的使用–>bean的销毁
      • 实例化:也就是new一个对象
      • 属性注入:Spring上下文对实例化的bean进行配置(IOC注入)
      • 设置beanId:如果实现BeanNameAware接口,调用setBeanName()方法设置ID
      • 调用BeanFactoryAware.setBeanFactory(setBeanFactory(BeanFactory):可以用这个方式来获取其它Bean,只需在Spring配置文件中配置一个普通的Bean就可以;
      • 调用ApplicationContextAware.setApplicationContext(ApplicationContext):与BeanFactoryAware.setBeanFactory同样作用,但是ApplicationContextAware是子接口,可以实现更多接口;
      • 实例化之前调用:BeanPostProcessor.postProcessBeforeInitialization(Object obj, String s)方法调用,
      • 实例化:如果在spring配置中还配置了init-method属性,会自动调用该方法;
      • 实质化之后调用:如果关联BeanPostProcessor接口,调用postProcessAfterInitialization(Object obj, String s)方法,
      • 注:前面这里我们就完成bean的实例化;
      • bean的销毁:当bean不再被使用时,就会调用destroy()方法;
      • bean销毁调用方法:如果配置了destroy-method方法,会自动调用该方法;

以上就是spring对Bean生命周期的全部过程。

<think>好的,用户想了解Spring Bean生命周期,可能是为了面试或者学习Spring框架。我需要详细解释这个过程,结合提供的引用内容,确保信息准确。 首先,用户给出的引用中提到了BeanDefinition的解析,这是Spring容器启动时的重要步骤。Bean生命周期BeanDefinition开始,需要先说明这一点。然后,实例化、属性填充、初始化、销毁等阶段,每个阶段都有对应的处理,比如Aware接口、BeanPostProcessor等。 引用1提到Bean工厂根据BeanDefinition进行实例化和初始化,所以生命周期应该从BeanDefinition解析开始。接下来,引用3中的invokeAwareMethods处理BeanNameAware、BeanClassLoaderAware和BeanFactoryAware接口,这应该在属性填充之后,初始化之前。 初始化阶段包括BeanPostProcessor的before和after处理,引用4和5提到postProcessBeforeInitialization和postProcessAfterInitialization方法,这些应该在InitializingBean的afterPropertiesSet和自定义init方法之前和之后执行。 销毁阶段涉及DisposableBean的destroy方法和自定义的销毁方法,引用2中的InitDestroyAnnotationBeanPostProcessor处理销毁前的回调。 需要将这些步骤按顺序排列,确保每个阶段都涵盖,并引用对应的引用来源。同时,用户可能需要面试知识点,所以要用清晰的结构,分阶段说明,并标注关键扩展点,比如BeanPostProcessor和Aware接口。 可能的问题包括各个阶段的顺序、扩展点的作用、BeanDefinition的角色等。生成相关问题时要覆盖这些方面,帮助用户深入理解。 最后,检查是否符合系统级指令:使用中文,正确引用,相关问题和回答结构清晰。确保LaTeX格式正确,但问题中没有数学公式,所以可能不需要使用。不过用户给的示例中有代码块,所以在回答中如果有代码示例的话需要用正确格式,但当前引用中的代码已经用代码块处理了。</think>### Spring Bean生命周期详解(面试知识点) Spring Bean生命周期Spring框架的核心机制之一,理解其过程对面试和实际开发都至关重要。以下是详细的生命周期过程,结合关键扩展点: --- #### **1. BeanDefinition解析** Spring容器启动时,所有配置(XML、注解、@Component扫描等)会被解析为$BeanDefinition$对象,存储Bean的元数据(类名、作用域、属性等)[^1]。 示例配置来源: ```xml <bean id="userService" class="com.example.UserService"/> ``` --- #### **2. 实例化(Instantiation)** 通过反射调用构造方法创建Bean实例。 - **无参构造**:默认方式 - **有参构造**:需配合@Autowired或\<constructor-arg\> --- #### **3. 属性填充(Population)** 注入依赖的属性和对象,例如: - 通过@Autowired自动注入 - 通过\<property\>标签手动配置 --- #### **4. Aware接口回调** 若Bean实现了特定Aware接口,Spring会注入相关依赖: ```java // 示例:BeanNameAware public class MyBean implements BeanNameAware { @Override public void setBeanName(String name) { System.out.println("Bean名称:" + name); // 输出Bean的ID } } ``` 支持的Aware接口: - $BeanNameAware$(注入Bean ID) - $BeanFactoryAware$(注入BeanFactory) - $ApplicationContextAware$(注入ApplicationContext)[^3] --- #### **5. BeanPostProcessor前置处理** 调用$BeanPostProcessor.postProcessBeforeInitialization()$,可在此修改Bean实例[^4]。 示例: ```java public class CustomProcessor implements BeanPostProcessor { @Override public Object postProcessBeforeInitialization(Object bean, String beanName) { // 对Bean进行增强(如代理) return bean; } } ``` --- #### **6. 初始化(Initialization)** 分两步执行: 1. **InitializingBean.afterPropertiesSet()** 实现该接口的Bean需定义初始化逻辑。 2. **自定义初始化方法** 通过@PostConstruct注解或XML的`init-method`属性指定。 示例: ```java public class UserService implements InitializingBean { @PostConstruct public void customInit() { System.out.println("自定义初始化"); } @Override public void afterPropertiesSet() { System.out.println("接口初始化"); } } ``` --- #### **7. BeanPostProcessor后置处理** 调用$BeanPostProcessor.postProcessAfterInitialization()$,常用于AOP代理生成[^5]。 --- #### **8. Bean就绪** 此时Bean已进入应用上下文,可被其他对象依赖使用。 --- #### **9. 销毁(Destruction)** 容器关闭时触发: 1. **@PreDestroy注解方法** 2. **DisposableBean.destroy()** 3. **XML配置的`destroy-method`** ```java public class ResourceCleanupBean implements DisposableBean { @Override public void destroy() { System.out.println("释放资源"); } } ``` 销毁前会调用$InitDestroyAnnotationBeanPostProcessor$处理回调[^2]。 --- ### **生命周期流程图** $$ \text{BeanDefinition解析} \rightarrow \text{实例化} \rightarrow \text{属性填充} \rightarrow \text{Aware回调} \rightarrow \text{BeanPostProcessor前置} \rightarrow \text{初始化} \rightarrow \text{BeanPostProcessor后置} \rightarrow \text{使用} \rightarrow \text{销毁} $$ --- ### **关键面试点** 1. **BeanPostProcessor的作用**:在初始化前后拦截修改Bean(如AOP代理)。 2. **Aware接口的意义**:让Bean感知容器信息(如Bean ID)。 3. **BeanDefinition的角色**:定义Bean的“蓝图”,决定实例化方式。 ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值