Spring Framework常用面试题及答案汇总

1.什么是Spring Framework ?

Spring Framework 是一个提供了完整性的编程或配置一个现代化的基于JAVA的企业应用,各种基础设施的支持。

参见官方(https://spring.io/projects/spring-framework#overview):

The Spring Framework provides a comprehensive programming and configuration model for modern Java-based enterprise applications - on any kind of deployment platform.

Spring makes it easy to create Java enterprise applications. It provides everything you need to embrace the Java language in an enterprise environment, with support for Groovy and Kotlin as alternative languages on the JVM, and with the flexibility to create many kinds of architectures depending on an application's needs. As of Spring Framework 5.1, Spring requires JDK 8+ (Java SE 8+) and provides out-of-the-box support for JDK 11 LTS. Java SE 8 update 60 is suggested as the minimum patch release for Java 8, but it is generally recommended to use a recent patch release.

2.Spring Framework有哪些核心模块 ?

  • spring-context : 事件驱动,注解驱动,模块驱动等
  • spring-core : Spring基础API模块,如资源管理、泛型处理
  • spring-beans : Spring Bean 相关,如依赖查找、依赖注入
  • spring-aop : Spring AOP 处理,如动态代理、AOP字节码提升
  • spring-expression : Spring表达式语言模块

(项目使用Maven进行管理时,引入 spring-context模块后,则会传递依赖加载其他4个模块)

3.什么是IOC ?

IOC是控制反转,类似于好莱坞原则(你不要打电话给我,我会打电话给你),主要包含依赖查找和依赖注入

4.依赖注入和依赖查找的区别 ?

依赖查找是主动或手动的依赖查找方式,通常需要依赖容器或标准API实现。而依赖注入则是手动或自动依赖绑定的方式,无需依赖特定的容器和API

5.Spring作为IOC容器的优势有哪些 ?

典型的IOC容器管理,依赖注入、依赖查找

  • AOP抽象
  • 事物抽象
  • 事件机制
  • SPI扩展
  • 强大的第三方整合
  • 易测试性 等

6.Spring 中 BeanFactory和FactoryBean区别 ?

BeanFactory是IOC底层容器

FactoryBean 是创建Bean的一种方式,帮助实现复杂的初始化逻辑

7.Spring 中 BeanFactory和ObjectFactory区别 ?

ObjectFactory和BeanFactory均提供依赖查找的能力;

ObjectFactory仅关注一个或一种类型的Bean的依赖查找,并且自身不具备依赖查找的能力,能力则由BeanFactory输出;

BeanFactory则提供了单一类型、集合类型以及层次性等多种依赖查找方式;

8.BeanFactory.getBean 操作是否线程安全 ?

BeanFactory.getBean 方法的执行是线程安全的,操作过程中会增加互斥锁.

9.Spring有多少种依赖注入的方式 ?

  • 构造器注入
  • Setter方法注入
  • 字段注入
  • 方法注入
  • 接口回调注入

10.Spring偏好构造器注入还是Setter注入 ?

两种依赖注入方式均可以使用,如果是必须依赖的话,推荐使用构造器注入,Setter注入用于可选依赖

11.Spring注入和依赖来源是否相同 ?

不相同,依赖查找的来源仅限于Spring BeanDefinition 以及单例对象;依赖注入的来源还包括 ResolvableDependency以及@Value所标注的外部化配置

12.单例对象能在Ioc容器启动后注册吗 ?

可以的,单例对象的注册于BeanDefinition不同,BeanDefinition会被ConfigurableListableBeanFactory#freezeConfiguration()方法影响,从而冻结注册,单例对象则没有这个限制

13.Spring依赖注入的来源有哪些 ?

Spring BeanDefinition

单例对象

  Resolvable Dependency

@Value 外部化配置

14.Spring内建的Bean作用域有几种 ?

  • singleton -- 默认单例 ☆
  • prototype -- 原型
  • request -- Web中使用
  • session
  • application
  • websocket

15.Spring 中 singleton Bean 是否在一个应用中是唯一的 ?

否, singleton bean 仅在当前Spring IoC 容器(Bean Factory)中是单例对象; 而BeanFactory可能存在父容器

16.Spring 中 BeanPostProcessor 的使用场景有哪些 ?

Spring 中 BeanPostProcessor 提供 Spring Bean 初始化前和初始化后的生命周期回调;分别对应 postProcessBeforeInitialization 以及 postProcessAfterInitialization 方法,允许对关心的 Bean 进行扩展,甚至替换。

其中 ApplicationContext 相关的 Aware 回调也是基于 BeanPostProcessor 实现,即 ApplicationContextAwareProcessor

17.Spring 中 BeanFactoryPostProcessor 与 BeanPostProcessor 的区别 ?

BeanFactoryPostProcessor 是 Spring BeanFactory(实际为 ConfigureableListableBeanFactory)的后置处理器,用于扩展 BeanFactory, 或通过 BeanFactory 进行依赖查找或依赖注入;

BeanFactoryPostProcessor 必须有 Spring ApplicationContext 执行,BeanFactory 无法与其直接交互;

BeanPostProcessor 则直接与 BeanFactory 关联,属于N对1的关系。

18.Spring 中 BeanFactory 是如何处理 Bean 的生命周期 ?

BeanFactory的默认实现为 DefaultListableBeanFactory,其中Bean生命周期与方法映射如下:

  • BeanDefinition 注册阶段 -- registerBeanDefinition
  • BeanDefinition 合并阶段 -- getMergedBeanDefinition
  • Bean 实例化前阶段 -- resolveBeforeInstantiation
  • Bean 实例化阶段 -- createBeanInstance
  • Bean 实例化后阶段 --populateBean
  • Bean 属性赋值前阶段 -- populateBean
  • Bean Aware 接口回调阶段 -- initializeBean
  • Bean 初始化前阶段 -- initializeBean
  • Bean 初始化阶段 -- initializeBean
  • Bean 初始化后阶段 -- initializeBean
  • Bean 初始化完成阶段 -- preInstantiateSingletons
  • Bean 销毁前阶段 -- destroyBean
  • Bean 销毁阶段 -- destroyBean

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 简单了解Spring Framework5.0新特性

    SpringFramework5.0是自2013年12月版本4发布之后SpringFramework的第一个主发行版.SpringFramework项目的领导人JuergenHoeller于2016年7月28日宣布了第一个SpringFramework5.0里程碑版本(5.0M1). 现在,将近一年的时间过去以后,我们期盼已久的RC3版本将于2017年7月18日发行.这是路线图规划中SpringFramework5.0首个GA发行版的最后一次发行. 从高层来看,SpringFramework5.

  • spring framework体系结构及模块jar依赖关系详解

    本文对于Spring的JAR包使用和配置,结合网友材料以spring 4.3.6.RELEASE版本为例,介绍spring框架结构和各模块对应JAR包以及模块间JAR依赖关系. 注:不同版本JAR包依赖会有所区别 spring官网给出了一张spring4的结构图 图中可以简单认为将spring分为5个部分:core.aop.data access.web.test,图中每个圆角矩形都对应相应jar包,如果在maven中配置,所有这些jar的"groupId"都是"org.sp

  • 使用Spring Framework 时常犯的十大错误(小结)

    1. 错误一:太过关注底层 我们正在解决这个常见错误,是因为 "非我所创" 综合症在软件开发领域很是常见.症状包括经常重写一些常见的代码,很多开发人员都有这种症状. 虽然理解特定库的内部结构及其实现,在很大程度上是好的并且很有必要的(也可以是一个很好的学习过程),但作为软件工程师,不断地处理相同的底层实现细节对个人的开发生涯是有害的.像 Spring 这种抽象框架的存在是有原因的,它将你从重复地手工劳作中解放出来,并允许你专注于更高层次的细节 -- 领域对象和业务逻辑. 因此,接受抽象

  • SPRING FRAMEWORK BEAN作用域和生命周期原理解析

    这篇文章主要介绍了SPRING FRAMEWORK BEAN作用域和生命周期原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Spring beand的作用域 设置为singleton时,相当于一个类只能有一个实例,当再次申请时,返回的是同一个实例 可以看到两个bean实例的hashcode值是一样的,说明在此申请到的是同一个实例 将bean的作用域设置为prototype时,再次运行,可以看到,申请到的是两个不同bean实例 目前只学习

  • SpringFramework应用接入Apollo配置中心过程解析

    环境: SpringFramework:4.3.5.RELEASE apollo-client:1.5.1 1.在项目的 resources/META-INF/ 目录下添加 app.properties 文件: #Apollo配置id app.id = phpdragon-demo apollo.bootstrap.enabled = true apollo.eagerLoad.enabled = true apollo.cacheDir = /data/app_data/apollo_cach

  • Spring Framework 5.0 入门教程

    1. 为什么学习Spring? 随着对Java EE的不断接触和理解,你会发现Spring 在各个企业和项目中发挥着越来越重要的作用.掌握Spring 已成为我们IT行业生存必学的本领之一. Spring Framework 是一个开源的Java/Java EE全功能栈(full-stack)的应用程序框架,以Apache许可证形式发布,也有.NET平台上的移植版本. 该框架基于 Expert One-on-One Java EE Design and Development(ISBN 0-76

  • Spring Framework常用面试题及答案汇总

    1.什么是Spring Framework ? Spring Framework 是一个提供了完整性的编程或配置一个现代化的基于JAVA的企业应用,各种基础设施的支持. 参见官方(https://spring.io/projects/spring-framework#overview): The Spring Framework provides a comprehensive programming and configuration model for modern Java-based e

  • Java面试题及答案集锦(基础题122道,代码题19道)

    Java基础面试题及答案集锦(基础题122道,代码题19道),具体详情如下所示: 1.面向对象的特征有哪些方面 1.抽象: 抽象就是忽略一个主题中与当前目标无关的那些方面,以便更充分地注意与当前目标有关的方面.抽象并不打算了解全部问题,而只是选择其中的一部分,暂时不用部分细节.抽象包括两个方面,一是过程抽象,二是数据抽象. 2.继承: 继承是一种联结类的层次模型,并且允许和鼓励类的重用,它提供了一种明确表述共性的方法.对象的一个新类可以从现有的类中派生,这个过程称为类继承.新类继承了原始类的特性

  • Java经典面试题最全汇总208道(三)

    目录 前言 websocket应用的是哪个协议 106.说一下 tcp 粘包是怎么产生的? 107.请列举出在 JDK 中几个常用的设计模式? 108.什么是设计模式?你是否在你的代码里面使用过任何设计模式? 110.在 Java 中,什么叫观察者设计模式(observer design pattern)? 111.使用工厂模式最主要的好处是什么?在哪里使用? 112.请解释自动装配模式的区别? 113.举一个用 Java 实现的装饰模式(decorator design pattern)?它是

  • 关于Spring AOP使用时的一些问题汇总

    在使用AOP的时候遇到了一些问题,特此记录一下 首先写一个常用的AOP切片 切片类AopLog package com.mantis.aop.aspect; import com.fasterxml.jackson.databind.ObjectMapper; import com.mantis.aop.common.util.DataUtil; import eu.bitwalker.useragentutils.UserAgent; import org.aspectj.lang.JoinP

  • 非常全面的Python常见基础面试题及答案

    目录 Python 1 Python垃圾回收机制是什么 2 元组和列表的区别 3 元组可以作为字典的key? 4 进程 线程 协程 4.1 进程 4.2 线程 4.3 协程 5 赋值.浅拷贝和深拷贝 6 GIL 7 列表去重 8 最常用的排序算法及其复杂度 8.1 冒泡排序 9 闭包 10 with 11 实例方法 静态方法 12 迭代器和生成器 12.1 迭代器 12.2 生成器 13 匿名函数 14 map reduce filter 14.1 map 14.2 reduce 14.3 fi

  • Java经典面试题最全汇总208道(五)

    目录 前言 152.什么是 YAML? 153.如何使用 Spring Boot 实现分页和排序? 154.如何使用 Spring Boot 实现异常处理? 155.单点登录 156.Spring Boot比Spring多哪些注解 157.打包和部署 158.Spring Boot如何访问不同的数据库 159.查询网站在线人数 160.easyExcel如何实现 161.什么是 Swagger?你用 Spring Boot 实现了它吗? 162.数据库的三范式是什么? 163.一张自增表里面总共

  • Java经典面试题最全汇总208道(四)

    目录 前言 126.Spring 框架中的单例 Beans 是线程安全的么? 127.请解释 Spring Bean 的自动装配? 129.什么是 Spring Batch? 130.spring mvc 和 struts 的区别是什么? 131.请举例解释@Required 注解? 132.Spring常用注解 133.项目中是如何实现权限验证的,权限验证需要几张表 134.谈谈controller,接口调用的路径问题 135.如何防止表单重复提交 136.Spring中都应用了哪些设计模式

  • Java经典面试题最全汇总208道(二)

    目录 前言 53.concurrentHashMap和HashTable有什么区别 54.HasmMap和HashSet的区别 55.请谈谈 ReadWriteLock 和 StampedLock 56.线程的run()和start()有什么区别? 57.为什么我们调用 start() 方法时会执行 run() 方法,为什么我们不能直接调用 run() 方法? 58.Synchronized 用过吗,其原理是什么? 59.JVM 对 Java 的原生锁做了哪些优化? 60.为什么 wait(),

  • Java经典面试题最全汇总208道(一)

    目录 前言 1.JDK 和 JRE 有什么区别? 2.== 和 equals 的区别是什么? 3.final 在 java 中有什么作用? 4.java 中的 Math.round(-1.5) 等于多少? 5.String 属于基础的数据类型吗? 6.String str="i"与 String str=new String(“i”)一样吗? 7.如何将字符串反转? 8.String 类的常用方法都有那些? 9.new String("a") + new Strin

  • Java经典面试题最全汇总208道(六)

    目录 前言 181.什么是类加载器,类加载器有哪些? 182.说一下类加载的执行过程? 183.JVM的类加载机制是什么? 184.什么是双亲委派模型? 185.怎么判断对象是否可以被回收? 186.说一下 jvm 有哪些垃圾回收算法? 187.说一下 jvm 有哪些垃圾回收器? 188.JVM栈堆概念,何时销毁对象 189.新生代垃圾回收器和老生代垃圾回收器都有哪些?有什么区别? 190.详细介绍一下 CMS 垃圾回收器? 191.简述分代垃圾回收器是怎么工作的? 192.Redis是什么?

随机推荐