Bean的生命周期是怎么样的?Bean的作用域是怎样的?

SpringBean生命周期详解与作用域解析
本文详细阐述了Spring框架中Bean的生命周期,从实例化、属性赋值、初始化到销毁的各个阶段,包括Bean的 Aware 接口、BeanPostProcessor 的处理以及自定义初始化和销毁方法。同时,介绍了Bean的五种作用域,如singleton、prototype等,解释了它们在不同场景下的应用。通过对SpringBean生命周期的理解,有助于更好地管理和控制Spring应用中的对象状态。

简单来说,Spring Bean的生命周期只有四个阶段:实例化 Instantiation --> 属性赋值 Populate  --> 初始化 Initialization  --> 销毁 Destruction。

具体来说分为以下步骤:

1.当容器启动时,Bean的实例化。Bean容器找到配置文件中Spring Bean的定义。Bean容器利用Java Reflection API创建一个Bean的实例。

2.Bean的属性赋值。利用set()方法设置一些属性值。

3.如果实现了其他*Aware接口,就调用相应的方法。

如果Bean实现了BeanNameAware接口,调用setBeanName()方法,传入Bean的名字。

如果Bean实现了BeanClassLoaderAware接口,调用setBeanClassLoader()方法,传入ClassLoader对象的实例。

如果Bean实现了BeanFactoryAware接口,调用setBeanClassFacotory()方法,传入ClassLoader对象的实例。

4.执行BeanPostProcessor接口的postProcessBeforeInitialization方法。

5.执行InitializingBean接口的afeterPropertiesSet()方法。

6.执行配置文件中定义的init-method属性指定的方法。

7.执行BeanPostProcessor接口的postProcessAfterInitialization()方法。

8.bean存在与容器中。

9.当容器结束时,Bean要销毁时,执行DisposableBean接口的destroy()方法。

10.执行配置文件中的定义的destroy-method属性指定的方法。

11.bean销毁。

 

Bean的作用域

(1)singleton:默认作用域,单例bean,每个容器中只有一个bean的实例。

(2)prototype:为每一个bean请求创建一个实例。

(3)request:为每一个request请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。

(4)session:与request范围类似,同一个session会话共享一个实例,不同会话使用不同的实例。

(5)global-session:全局作用域,所有会话共享一个实例。如果想要声明让所有会话共享的存储变量的话,那么这全局变量需要存储在global-session中。
 

### Spring 框架中 Bean生命周期过程 Spring 中的 Bean 生命周期是一个从创建到销毁的过程,主要分为以下几个阶段: #### 1. 实例化 在实例化阶段,Spring 容器会根据配置文件或注解定义的 Bean 类型,为 Bean 分配内存空间并创建实例。此阶段的核心任务是通过反射机制调用构造函数来生成对象[^1]。 #### 2. 属性赋值 在属性赋值阶段,Spring 容器将依赖注入(Dependency Injection, DI)应用到 Bean 上,即将所需的依赖项注入到 Bean 的属性中。这包括通过构造函数注入、Setter 方法注入以及字段注入等方式完成属性的初始化[^1]。 #### 3. 初始化前处理 在初始化前处理阶段,Spring 容器会调用 `BeanNameAware`、`BeanFactoryAware` 等 Aware 接口的方法,允许 Bean 获取其在容器中的名称或引用容器本身。此外,如果 Bean 实现了 `InitializingBean` 接口,还会在此阶段调用 `afterPropertiesSet` 方法[^4]。 #### 4. 执行后处理器 在执行后处理器阶段,Spring 容器会调用所有注册的 `BeanPostProcessor` 后处理器。这些后处理器会在 Bean 初始化前后分别调用 `postProcessBeforeInitialization` 和 `postProcessAfterInitialization` 方法,从而对 Bean 进行进一步的定制或增强[^5]。 #### 5. 初始化 在初始化阶段,Spring 容器会调用用户自定义的初始化方法(例如通过 `@PostConstruct` 注解或 `<bean>` 配置中的 `init-method` 属性指定的方法)。此阶段的主要目的是让 Bean 在被实际使用之前完成必要的初始化工作[^1]。 #### 6. 使用 Bean 在使用阶段,Bean 已经完全初始化完毕,可以被应用程序代码正常使用。此时,Bean 的状态和行为已经稳定,能够满足业务需求。 #### 7. 销毁 对于单例作用域(singleton scope)的 Bean,在 Spring 容器关闭时会调用销毁方法(例如通过 `@PreDestroy` 注解或 `<bean>` 配置中的 `destroy-method` 属性指定的方法)。而对于原型作用域(prototype scope)的 BeanSpring 容器不会负责其销毁,而是交由 Java 垃圾回收机制处理[^3]。 ### 示例代码 以下是一个完整的示例,展示了 Spring Bean 生命周期的各个阶段: ```java import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; import org.springframework.beans.BeansException; import org.springframework.beans.factory.BeanNameAware; import org.springframework.beans.factory.InitializingBean; import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContextAware; public class LifecycleDemo implements BeanNameAware, ApplicationContextAware, InitializingBean { private String beanName; private ApplicationContext applicationContext; @PostConstruct public void postConstruct() { System.out.println("PostConstruct method called"); } @Override public void setBeanName(String name) { this.beanName = name; System.out.println("BeanNameAware method called, bean name: " + name); } @Override public void setApplicationContext(ApplicationContext context) throws BeansException { this.applicationContext = context; System.out.println("ApplicationContextAware method called"); } @Override public void afterPropertiesSet() throws Exception { System.out.println("InitializingBean method called"); } public void customInit() { System.out.println("Custom init method called"); } @PreDestroy public void preDestroy() { System.out.println("PreDestroy method called"); } public void customDestroy() { System.out.println("Custom destroy method called"); } } ``` ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值