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容器启动后注册吗 ?