Java面试八股之Spring中Bean的作用域

  1. Spring中Bean的作用域

在Spring框架中,Bean的作用域(Scope)决定了Bean实例的生命周期和可见性。Spring支持多种作用域,主要的作用域有以下几种:

Singleton:

描述: 这是默认的作用域,意味着Spring IoC容器中仅存在一个Bean实例,Bean以单例方式存在。

行为: 无论有多少个请求,容器中只会有一个Bean实例存在,所有对该Bean的请求都会返回同一个实例。

场景: 通常用于无状态的Bean,如服务层和数据访问层等。

Prototype:

描述: 每次从容器中请求Bean时,都会创建一个新的实例。

行为: 每个请求都会返回一个新的独立实例,这意味着Bean可以有不同的状态。

场景: 当需要每个客户端有自己的Bean实例时,例如当Bean包含可变的状态信息时。

Request:

描述: 每个HTTP请求都会创建一个新的Bean实例。

行为: Bean实例仅在当前HTTP请求内有效。

场景: Web应用程序中,当需要每个HTTP请求有自己的Bean实例时。

Session:

描述: 每个HTTP会话都会创建一个新的Bean实例。

行为: Bean实例仅在当前HTTP会话内有效。

场景: 当需要在一次用户的会话期间保持Bean的状态时。

GlobalSession:

描述: 类似于Session作用域,但主要用于Portlet应用环境。

行为: Bean实例在全局会话范围内共享。

场景: Portlet应用中,当需要在用户的全局会话中共享Bean实例时。

Application:

描述: 一个Bean定义对应于单个ServletContext的生命周期。

行为: Bean实例在整个Web应用中共享。

场景: 当需要在整个Web应用范围内共享Bean实例时。

WebSocket:

描述: 一个Bean定义对应于单个WebSocket的生命周期。

行为: Bean实例在单个WebSocket连接期间有效。

场景: WebSocket通信中,当需要在WebSocket连接期间保持状态时。

这些作用域的选择取决于具体的应用场景和需求。例如,对于无状态的服务层逻辑,通常使用Singleton作用域;而对于需要维护会话状态的Web应用程序,则可能使用Session作用域。正确地选择Bean的作用域可以提高应用程序的性能和可维护性。

如果大家需要视频版本的讲解,欢迎关注我的B站:

### Java 面试常见问题汇总及高频考点 Java 面试中涉及的知识点广泛,涵盖了 Java 基础、JVM、多线程与并发、Spring、MyBatis、Spring Boot、MySQL、Spring Cloud、Dubbo、Nginx、MQ、数据结构与算法、Linux 等多个方面。以下是常见的高频考点及知识点总结。 --- ### Java 基础 Java 基础是面试的起点,常考内容包括: - **基本数据类型与包装类**:如 `int` 与 `Integer` 的区别。 - **String、StringBuffer 与 StringBuilder**:`String` 是不可变的,而 `StringBuffer` 和 `StringBuilder` 是可变的,其中 `StringBuffer` 是线程安全的,适用于多线程场景;`StringBuilder` 是非线程安全的,性能更优[^1]。 - **异常处理机制**:使用 `try-catch-finally` 结构进行异常捕获和处理,`finally` 块无论是否抛出异常都会执行。 - **集合框架**:包括 `List`、`Set`、`Map` 的常用实现类及其特性,如 `ArrayList`、`LinkedList`、`HashSet`、`HashMap` 等。 - **泛型与注解**:泛型提供编译时类型检查,注解用于元数据描述,如 `@Override`、`@Deprecated`。 - **反射机制**:通过 `Class` 类动态获取类信息并操作类的属性和方法。 示例代码: ```java Map<String, Integer> map = new HashMap<>(); map.put("one", 1); map.put("two", 2); System.out.println(map.get("one")); // 输出 1 ``` --- ### JVM 与内存管理 JVM 是 Java 面试中较为深入的部分,常考内容包括: - **JVM 内存模型**:分为方法区、堆、栈、程序计数器、本地方法栈。 - **垃圾回收机制**:GC 的基本原理,如标记-清除、复制、标记-整理等算法。 - **判断无用类的标准**:该类的所有实例已被回收,加载该类的 `ClassLoader` 被回收,且该类对应的 `Class` 对象没有被引用[^4]。 - **类加载机制**:包括加载、验证、准备、解析、初始化五个阶段。 --- ### 多线程与并发 Java 多线程是面试中的重点,常考内容包括: - **线程的创建方式**:继承 `Thread` 类或实现 `Runnable` 接口。 - **线程状态**:新建、就绪、运行、阻塞、等待、超时等待、终止。 - **线程调度方法**:如 `yield()` 方法让出 CPU 时间片,`sleep()` 方法使线程进入阻塞状态[^5]。 - **线程同步与锁机制**:包括 `synchronized` 关键字、`ReentrantLock`、`volatile` 关键字。 - **线程池**:使用 `ExecutorService` 创建线程池,避免频繁创建和销毁线程。 示例代码: ```java public class MyThread extends Thread { public void run() { System.out.println("Thread is running"); } } ``` --- ### Spring 框架 SpringJava 后端开发的核心框架之一,常考内容包括: - **IoC 容器**:控制反转,通过容器管理对象的生命周期和依赖关系。 - **AOP 编程**:面向切面编程,用于日志记录、事务管理等。 - **Bean作用域**:包括 `singleton`、`prototype`、`request`、`session` 等。 - **Spring Boot 自动配置原理**:基于 `@Conditional` 注解实现条件化配置。 --- ### 数据库与 MySQL MySQL 是 Java 后端开发中常用的数据库,常考内容包括: - **索引优化**:B+ 树索引、覆盖索引、最左前缀原则。 - **事务与隔离级别**:ACID 特性,四种隔离级别及脏读、不可重复读、幻读等问题。 - **锁机制**:行锁、表锁、间隙锁。 - **高可用与主从复制**:主从复制的原理与优化,读写分离策略。 --- ### 分布式架构与微服务 随着分布式系统的普及,微服务相关知识成为高频考点: - **Spring Cloud 组件**:如 Eureka、Ribbon、Feign、Hystrix、Zuul、Config、Gateway。 - **Dubbo 与 Zookeeper**:服务注册与发现、负载均衡策略、容错机制。 - **Nginx 与负载均衡**:反向代理、动静分离、负载均衡策略。 - **消息队列**:如 RabbitMQ、Kafka、RocketMQ,常用于解耦、异步处理、流量削峰。 --- ### 数据结构与算法 数据结构与算法是技术面试的基础,常考内容包括: - **常见数据结构**:数组、链表、栈、队列、树、图、哈希表。 - **排序算法**:冒泡排序、快速排序、归并排序、堆排序等。 - **查找算法**:二分查找、深度优先搜索(DFS)、广度优先搜索(BFS)。 - **LeetCode 高频题**:如两数之和、最长回文子串、合并两个有序链表等。 --- ### Linux 与系统运维 Linux 是 Java 程序员必须掌握的操作系统,常考内容包括: - **常用命令**:如 `top`、`ps`、`netstat`、`grep`、`awk`、`sed`。 - **文件操作**:查看、编辑、压缩、解压文件。 - **权限管理**:用户权限、文件权限、`chmod` 命令。 - **Shell 脚本**:自动化脚本编写。 --- ### 相关问题 1. Java 中的 `volatile` 关键字有什么作用? 2. Java 中的 `transient` 关键字在序列化中的作用是什么? 3. Java 中的 `try-with-resources` 是如何工作的? 4. Java 中的 `Optional` 类有什么作用? 5. Java 中的 `Stream API` 有哪些常用操作?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值