java八股系列——Spring Bean的作用域与生命周期

文章详细介绍了Spring框架中Bean的五种作用域,包括Singleton、Prototype、Request、Session和GlobalSession,并强调了不同作用域下的生命周期和适用场景。同时,文章阐述了SpringBean的生命周期,包括实例化、属性赋值、初始化、后置处理和销毁阶段,以及如何通过@PostConstruct和@PreDestroy注解定义初始化和销毁方法。

一:作用域

Spring Bean作用域是指在Spring容器中管理的Bean对象的生命周期和可见范围。Spring框架提供了五种Bean作用域:

  • Singleton(单例):单例模式,Spring IOC容器中只会存在一个共享的Bean实例,无论有多少个Bean引用它,始终指向同一对象。该模式在多线程下是不安全的。Singleton作用域是Spring中的缺省作用域,也可以显示地将 Bean定义为singleton模式
  • Prototype(原型):原型模式,每次通过Spring容器获取Prototype定义的bean时,容器都将创建一个新的Bean实例,每个Bean实例都有自己的属性和状态,而Singleton全局只有一个对象。根据经验,对有状态的bean使用Prototype作用域,而对无状态的bean使用Singleton作用域。需要注意的是,Spring在创建好交给使用者之后则不会再管理后续的生命周期。
  • Request(请求):在一次Http请求中,容器会返回该Bean的同一实例。而对不同的Http请求则会产生新的Bean,而且该bean仅在当前Http Request内有效,当前Http请求结束,该bean实例也将会被销毁。该作用域仅适用于WebApplicationContext环境。
  • Session(会话):在一次Http Session中,容器会返回该Bean的同一实例。而对不同的Session请求则会创建新的实例,该bean实例仅在当前Session内有效。同Http请求相同,每一次session请求创建新的实例,而不同的实例之间不共享属性,且实例仅在自己的 session 请求内有效,请求结束,则实例将被销毁。该作用域仅适用于WebApplicationContext环境。
  • GlobalSession(全局会话):在一个全局的HTTP会话中,每个Bean实例都会被创建一次,该作用域仅适用于WebApplicationContext环境。在一个全局的Http Session中,容器会返回该Bean的同一个实例,仅在使用 portlet context时有效。

通过配置Bean的作用域,可以控制Bean的生命周期和可见范围,从而更好地管理和利用Bean对象。

注:Global Session是指在整个应用程序中都可以访问和使用的会话对象。关键在于"整个应用程序",因为一个应用可能是部署在多台机器上的,而Global Session是多台机器共享的Session。Global Session可以通过不同的方式实现,例如使用数据库、缓存或分布式存储等。在Java中,可以使用Servlet API中的HttpSession来实现全局会话。需要注意的是,全局会话可能会带来一些安全风险,例如会话劫持和会话固定攻击等。因此,在实现全局会话时,需要采取一些安全措施,例如使用安全的会话ID、定期更新会话ID等。

二:生命周期

Spring Bean的生命周期可以分为以下几个阶段:

  1. 实例化(Instantiation):当Spring容器启动时,会根据配置文件或注解等方式创建Bean实例。
  2. 属性赋值(Populate):在实例化后,Spring容器会将配置文件或注解中的属性值注入到Bean实例中。
  3. BeanPostProcessor的前置处理:在Bean实例化和属性赋值之后,Spring容器会调用所有实现了BeanPostProcessor接口的类的postProcessBeforeInitialization方法,对Bean进行前置处理。
  4. 初始化(Initialization):在属性赋值完成后,Spring容器会调用Bean的初始化方法,可以通过实现InitializingBean接口或在配置文件中指定init-method来定义初始化方法。
  5. BeanPostProcessor的后置处理:在Bean初始化方法执行完成后,Spring容器会调用所有实现了BeanPostProcessor接口的类的postProcessAfterInitialization方法,对Bean进行后置处理。
  6. 销毁(Destruction):当Spring容器关闭时,会调用Bean的销毁方法,可以通过实现DisposableBean接口或在配置文件中指定destroy-method来定义销毁方法。

需要注意的是,Spring Bean的生命周期并不是线性的,可能会在某个阶段中断或回到之前的阶段。例如,在初始化阶段中,如果发生异常,则会回到实例化阶段重新创建Bean实例。

在这个过程中,可以通过实现接口或在配置文件中指定方法来定义Bean的初始化和销毁方法:

  • @PostConstruct:用于在Bean初始化之后执行一些操作。这个注解可以用在方法上,方法会在Bean初始化之后被调用。
  • @PreDestroy:用于在Bean销毁之前执行一些操作。这个注解可以用在方法上,方法会在Bean销毁之前被调用。

如果有兴趣了解更多相关内容,欢迎来我的个人网站看看:耶瞳空间

### Spring框架核心概念整理 #### 核心概念概述 Spring 是一个开源的、轻量级的企业级 Java 应用程序开发框架,其主要目标是通过降低复杂性和提高可维护性来简化企业应用程序的开发过程。Spring 的核心理念围绕 **IoC (Inversion of Control)** 和 **AOP (Aspect-Oriented Programming)** 展开。 - IoC(控制反转)是一种设计模式,旨在减少组件间的耦合度,使依赖关系由外部容器管理而非硬编码到代码中[^1]。 - AOP(面向切面编程)允许开发者将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来,从而增强代码的模块化程度[^2]。 --- ### 常见面试题整理 #### 1. Spring 的核心是什么? Spring 的核心在于它的 **IoC 容器** 和 **AOP 支持**。IoC 容器负责管理和创建对象实例,而 AOP 提供了一种机制来处理跨多个类的功能需求。 #### 2. Spring 中的 Bean 是什么?它包含哪些内容? BeanSpring 容器中被管理的对象,通常是由 Spring IOC 容器初始化、配置和管理的 POJO(Plain Old Java Object)。一个 Bean 的定义通常包括以下内容: - 类名 - 方法名称 - 构造函数参数 - 属性及其对应的 setter/getter 方法 - 生命周期回调方法 可以通过 XML 文件、注解或 Java 配置类的方式向 Spring 容器提供 Bean 的元数据[^4]。 #### 3. Spring 支持哪几种配置方式? Spring 支持三种主要的配置方式: - **XML 配置**:通过 `<bean>` 元素定义 Bean。 - **注解配置**:使用 `@Component`、`@Service`、`@Repository` 或其他自定义注解标记类,并配合扫描包路径完成注册。 - **Java 配置**:利用 `@Configuration` 注解声明配置类并通过 `@Bean` 注解显式定义 Bean 实例。 每种方式都有各自的适用场景,现代项目更倾向于采用注解或 Java 配置以提升灵活性和简洁性。 #### 4. Spring 中的 Singleton 和 Prototype Scope 有什么区别? - **Singleton Scope**:默认作用域下,Spring 容器会为每个 Bean 创建唯一的一个共享实例。无论多少次请求该 Bean,始终返回同一个对象实例。 - **Prototype Scope**:每次请求都会创建一个新的 Bean 实例,适用于需要独立状态的场合。 需要注意的是,在多线程环境下,默认情况下 Singleton Bean 并不是完全线程安全的,因为它们的状态可能会因不同线程的操作而改变。 #### 5. @Autowired 注解的工作原理是什么? 当使用 `@Autowired` 注解时,Spring 容器会在运行期间尝试按照类型匹配找到合适的候选者并将其实例注入到指定字段、构造函数或者方法参数上。如果存在多个符合条件的目标,则进一步依据限定符(Qualifier Annotation)缩小范围直至最终选定具体实现。 以下是简单的示例演示如何运用此功能: ```java @Service public class MyService { private final Dependency dependency; public MyService(@Autowired Dependency dependency) { this.dependency = dependency; } } ``` #### 6. Spring 是否可以注入 null 或空字符串? 是可以的!只要在属性值未设置的情况下,Spring 将自动将其设为空白字符序列;而对于那些明确标注了可能接受 NULL 输入的地方也会正常工作而不抛出异常。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值