一道78%的Java程序员搞不清的Spring bean面试题

简介: 一道78%的Java程序员搞不清的Spring bean面试题

熟悉Spring开发的朋友都知道Spring提供了5种scope分别是singleton、prototype、request、session、global session。
如下图是官方文档上的截图,感兴趣的朋友可以进去看看这五种分别有什么不同。今天要介绍的是这五种中的前两种,也是Spring最初提供的bean scope singleton 和 prototype。
Spring官方文档介绍如下图:image

单例bean与原型bean的区别

如果一个bean被声明为单例的时候,在处理多次请求的时候在Spring容器里只实例化出一个bean,后续的请求都公用这个对象,这个对象会保存在一个map里面。当有请求来的时候会先从缓存(map)里查看有没有,有的话直接使用这个对象,没有的话才实例化一个新的对象,所以这是个单例的。但是对于原型(prototype)bean来说当每次请求来的时候直接实例化新的bean,没有缓存以及从缓存查的过程。
1.画图分析

image

image

2.源码分析
生成bean时先判断单例的还是原型的
image

如果是单例的则先尝试从缓存里获取,没有在新创建
image

结论:
单例的bean只有第一次创建新的bean 后面都会复用该bean,所以不会频繁创建对象。
原型的bean每次都会新创建

单例bean的优势

由于不会每次都新创建新对象所以有一下几个性能上的优势:
1.减少了新生成实例的消耗
新生成实例消耗包括两方面,第一,spring会通过反射或者cglib来生成bean实例这都是耗性能的操作,其次给对象分配内存也会涉及复杂算法。
2.减少jvm垃圾回收
由于不会给每个请求都新生成bean实例,所以自然回收的对象少了。
3.可以快速获取到bean
因为单例的获取bean操作除了第一次生成之外其余的都是从缓存里获取的所以很快。

单例bean的劣势

单例的bean一个很大的劣势就是他不能做到线程安全!!!,由于所有请求都共享一个bean实例,所以这个bean要是有状态的一个bean的话可能在并发场景下出现问题,而原型的bean则不会有这样问题(但也有例外,比如他被单例bean依赖),因为给每个请求都新创建实例。关于这方面我正在准备写一篇文章,在整理当中,感兴趣的朋友可以关注我,我后续写一篇详细的文章。

总结

Spring 为啥把bean默认设计成单例?
答案:为了提高性能!!!从几个方面,
少创建实例
垃圾回收
缓存快速获取

单例有啥劣势?
如果是有状态的话在并发环境下线程不安全。
image

最后大家看一下,这20道关于Spring的面试题你会几道?
1 、什么是 Spring 框架?Spring 框架有哪些主要模块?
2 、使用 Spring 框架能带来哪些好处?
3 、什么是控制反转(IOC) ?什么是依赖注入?
4 、请解释下 Spring 框架中的 IoC ?
5 、BeanFactory 和 和 ApplicationContext 有什么区别?
6 、Spring 有几种配置方式?
7 、如何用基于 XML 配置的方式配置 Spring ?
8 、如何用基于 Java 配置的方式配置 Spring ?
9 、怎样用注解的方式配置 Spring ?
10 、请解释 Spring Bean 的生命周期?
11 、Spring Bean 的作用域之间有什么区别?
12 、什么是 Spring inner beans ?
13 、Spring 框架中的单例 Beans 是线程安全的么?
14 、请举例说明如何在 Spring 中注入一个 Java Collection ?
15 、如何向 Spring Bean 中注入一个 Java.util.Properties ?
16 、请解释 Spring Bean 的自动装配?
17 、请解释自动装配模式的区别?
18 、构造方法注入和设值注入有什么区别?
19 、Spring 框架中有哪些不同类型的事件?
20 、Spring 框架中都用到了哪些设计模式?

欢迎大家一起交流,喜欢文章记得点个赞哟,感谢支持!

相关文章
|
20天前
|
人工智能 Java API
Java也能快速搭建AI应用?一文带你玩转Spring AI可落地性
Java语言凭借其成熟的生态与解决方案,特别是通过 Spring AI 框架,正迅速成为 AI 应用开发的新选择。本文将探讨如何利用 Spring AI Alibaba 构建在线聊天 AI 应用,并实现对其性能的全面可观测性。
|
1月前
|
人工智能 Java 程序员
【AI程序员】通义灵码 AI 程序员全面上线JAVA使用体验
通过 AI 程序编写一个JAVA后台项目登陆页面
410 42
|
15天前
|
人工智能 Java API
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
|
1月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
116 14
|
1月前
|
安全 Java 程序员
Java 面试必问!线程构造方法和静态块的执行线程到底是谁?
大家好,我是小米。今天聊聊Java多线程面试题:线程类的构造方法和静态块是由哪个线程调用的?构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节有助于掌握Java多线程机制。下期再见! 简介: 本文通过一个常见的Java多线程面试题,详细讲解了线程类的构造方法和静态块是由哪个线程调用的。构造方法由创建线程实例的主线程调用,静态块在类加载时由主线程调用。理解这些细节对掌握Java多线程编程至关重要。
57 13
|
1月前
|
网络协议 Java Shell
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
java spring 项目若依框架启动失败,启动不了服务提示端口8080占用escription: Web server failed to start. Port 8080 was already in use. Action: Identify and stop the process that’s listening on port 8080 or configure this application to listen on another port-优雅草卓伊凡解决方案
76 7
|
12天前
|
存储 监控 数据可视化
SaaS云计算技术的智慧工地源码,基于Java+Spring Cloud框架开发
智慧工地源码基于微服务+Java+Spring Cloud +UniApp +MySql架构,利用传感器、监控摄像头、AI、大数据等技术,实现施工现场的实时监测、数据分析与智能决策。平台涵盖人员、车辆、视频监控、施工质量、设备、环境和能耗管理七大维度,提供可视化管理、智能化报警、移动智能办公及分布计算存储等功能,全面提升工地的安全性、效率和质量。
|
18天前
|
人工智能 Java API
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
Java 也能快速搭建 AI 应用?一文带你玩转 Spring AI 可观测性
|
Java 程序员
java程序员,如何坚持学习下去?
java程序员,如何坚持学习下去?
|
Kubernetes 安全 Java
Java程序员2021年应该学习的11项技能
Java程序员2021年应该学习的11项技能
190 0
Java程序员2021年应该学习的11项技能