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

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

单例bean与原型bean的区别

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

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

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

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

单例bean的优势

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

单例bean的劣势

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

总结

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

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

最后大家看一下,这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 框架中都用到了哪些设计模式?

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

原文地址:https://blog.51cto.com/14442094/2427865

时间: 2024-10-11 03:31:20

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

【软帝学院】Spring Boot 是什么?为什么说java程序员必须要掌握Spring Boot ?

Spring Boot 是什么?为什么说java程序员必须要掌握Spring Boot ? 我们从Spring Boot 诞生的背景是什么?Spring 企业又是基于什么样的考虑创建 Spring Boot? 企业使用 Spring Boot会带来什么样变化?来分析 Spring 历史 说起 Spring Boot 我们不得不先了解一下 Spring 这个企业,不仅因为 Spring Boot 来源于 Spirng 大家族,而且 Spring Boot 的诞生和 Sping 框架的发展息息相关.

Java程序员必须掌握的Spring依赖管理原理

Spring依赖注入 依赖注入(Dependency Injection)的意思就是对象通过构造器函数参数,工厂方法的参数,或者成员属性,定义了对象的依赖对象:容器在创建该对象时会负责注入这些依赖.这个过程是控制反转的,即不是由即将创建的对象来管理自己的依赖的发现和实例化,而是有Spring容器来实现. 在Spring中依赖注入有两种形式,第一种就是基于构造函数的注入,即通过调用构造函数,传入参数,也就是依赖来完成整个依赖注入流程:第二种就是基于setter方法的注入. 构造函数的参数的匹配,要

两年Java程序员面试经验分享,从简历制作到面试总结!

前言 工作两年左右,实习一年左右,正式工作一年左右,其实挺尴尬的,高不成低不就.因此在面试许多公司,找到了目前最适合自己的公司之后.于是做一个关于面试的总结.希望能够给那些依旧在找工作的同学提供帮助. 面试 其实关于面试总结这块,我也看过不少文章,但是大部分都是关于面试题以及面试中的问题所谈.但是对于一个不擅长找工作的同学来说,其实在简历制作这一块很重要.因为简历没写好的话,连面试邀请都没,何谈面试呢.所以我准备谈谈我对简历制作这块的一些见解.如有不妥,欢迎指出! 简历制作 在写简历这方面,需要

[转] Java程序员学C#基本语法两个小时搞定(对比学习)

Java程序员学C#基本语法两个小时搞定(对比学习) 对于学习一门新的语言,关键是学习新语言和以前掌握的语言的区别,但是也不要让以前语言的东西,固定了自己的思维模式,多看一下新的语言的编程思想. 1.引包 using System;java用import2.构造函数和java语法相同3.析构函数  变量和类的对象都有生命周期,生命周期结束,这些变量和对象就要被撤销.  类的对象被撤销时,将自动调用析构函数.一些善后工作可放在析构函数中完成.  析构函数的名字为~类名,无返回类型,也无参数.Per

Java程序员,如果你想要搞明白CDN,这篇应该够了!

程序员,如果想要搞明白CDN,这篇应该够了!最近在了解边缘计算,发现我们经常听说的CDN也是边缘计算里的一部分.那么说到CDN,好像只知道它中文叫做内容分发网络.那么具体CDN的原理是什么?能够为用户在浏览网站时带来什么好处呢?解决这两个问题是本文的目的. CDN概念CDN全称叫做"Content Delivery Network",中文叫内容分发网络. 实际上CDN这个概念是在1996年由美国麻省理工学院的一个研究小组为改善互联网的服务质量而提出的.那么它到底是怎么改善互联网服务质量

Java程序员面试题集(1-50)

下面的内容是对网上原有的Java面试题集及答案进行了全面修订之后给出的负责任的题目和答案,原来的题目中有很多重复题目和无价值的题目,还有不少的参考答案也是错误的,修改后的Java面试题集参照了JDK最新版本,去掉了EJB 2.x等无用内容,补充了数据结构和算法相关的题目.经典面试编程题.大型网站技术架构.操作系统.数据库.软件测试.设计模式.UML等内容,同时还对很多知识点进行了深入的剖析,例如hashCode方法的设计.垃圾收集的堆和代.Java新的并发编程.NIO.2等,相信对准备入职的Ja

JAVA程序员必看的15本书-JAVA自学书籍推荐

作为Java程序员来说,最痛苦的事情莫过于可以选择的范围太广,可以读的书太多,往往容易无所适从.我想就我自己读过的技术书籍中挑选出来一些,按照学习的先后顺序,推荐给大家,特别是那些想不断提高自己技术水平的Java程序员们.此外,大家可以加入457036818交流群,互相分享一下关于JAVA方面的知识.一.Java编程入门类 对于没有Java编程经验的程序员要入门,随便读什么入门书籍都一样,这个阶段需要你快速的掌握Java基础语法和基本用法,宗旨就是"囫囵吞枣不求甚解",先对Java熟悉

一个java程序员的年终总结

年底了,该给自己写点总结了! 从毕业到现在已经快4年啦,一直在Java的WEB开发行业混迹.我不是牛人,但是自我感觉还算是个合格的程序员,有必要写下自己将近4年来的经历,给自我以提示,给刚入行的朋友提供点参考. 第一. Java程序员需要不断的学习 貌似这一点适应的行业最广,但是我可以很肯定的说:当你从事web开发一年后,重新找工作时,才会真实的感受到这句话. 工作第一年,往往是什么都充满新鲜感,什么都学习,冲劲十足的一年:WEB行业知识更新特别快,今天一个框架的新版本,明天又是另一个新框架,有

Java程序员面试题收集(3)

面试中被问到过的题目: 1.<%@ include=""/>和<jsp:include page="" flush="true"/> 2.知道的GOF 模式,说明 3.自己的长期规划是什么,近期规划是什么? 4.override和overload 5.final关键字 6.系统如何分层,前台,逻辑,数据访问.你的职责,代码如何保证质量的 7.getAttribute 和getParameter 区别 8.forward和r