1. 什么是 Spring
Spring 框架是一个为 Java 应用程序的开发提供了综合、广泛的基础性支持的 Java 平台。
Spring 帮助开发者解决了开发中基础性的问题,使得开发人员可以专注于应用程序的开发。
2. Spring 框架有哪些主要的模块?
Spring 是一个轻量级框架,有七大模块,分别为 数据,Web,切面,工具,消息,核心,测试
总共 20 几个小模块
- 核心模块有 Beans,Core,Context,Expression , IOC 和 DI⭐
- 切面模块主要有 AOP ,涉及到这个 AOP 编程 ⭐
- Web模块有 Web,WebMVC, WebSocket, WebFlux
- 数据模块主要有 ORM ,TX
3. 使用 Spring 框架能带来哪些好处?
- Dependency Injection(DI) 方法使得构造器和 JavaBean properties 文件中的依赖关系一目了然。
- IoC 容器更加趋向于轻量级。这样一来IoC容器在有限的内存和CPU资源的情况下进行应用程序的开发和发布就变得十分有利。
- Spring 并没有闭门造车,Spring利用了已有的技术比如ORM框架、logging框架、J2EE、Quartz和JDK Timer,以及其他视图技术。
- Spring 框架是按照模块的形式来组织的。由包和类的编号就可以看出其所属的模块,开发者仅仅需要选用他们需要的模块即可。
- 要测试一项用 Spring 开发的应用程序十分简单,因为测试相关的环境代码都已经囊括在框架中了。更加简单的是,利用JavaBean形式的POJO类,可以很方便的利用依赖注入来写入测试数据。
- Spring 的Web框架亦是一个精心设计的Web MVC框架,为开发者们在web框架的选择上提供了一个除了主流框架比如Struts、过度设计的、不流行web框架的以外的有力选项。
- Spring 提供了一个便捷的事务管理接口,适用于小型的本地事物处理(比如在单DB的环境下)和复杂的共同事物处理(比如利用JTA的复杂DB环境)。
4. 什么是控制反转
控制反转(英语:Inversion of Control
,缩写为IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。
通俗地讲,IOC 就是把对象的创建、初始化、销毁交给 spring 来管理,而不是由开发者控制,实现控制反转。
5. 什么是依赖注入
- “依赖”是指接收方所需的对象。
- “注入”是指将“依赖”传递给接收方的过程。在“注入”之后,接收方才会调用该“依赖”。
依赖注入是控制反转最常见的设计原则,目的是为了分离关注点,分离接收方和依赖,从而提供松耦合以及代码重用性。
6. 为什么使用依赖注入
传统编程方式,需要手动创建一个实例并使用它。这带来的缺点和问题是:
- 如果使用不同类型的服务对象,就需要修改、重新编译。
- 客户类需要通过配置来适配服务类及服务类的依赖。如果程序有多个类都使用同一个服务类,这些配置就会变得复杂并分散在程序各处。
- 难以单元测试。本来需要使用服务类的 mock 或 stub,在这种方式下不太可行。
因为依赖注入有以下优点:
- 使用接口或抽象基类,来抽象化依赖实现。
- 依赖在一个服务容器中注册。客户类构造函数被注入服务实例。框架负责创建依赖实例并在没有使用者时销毁它。
7. 在 Java 中依赖注入有哪几种方式
主要有以下三种实现方式:
- 构造器注入
- Setter 方法注入
- 接口注入
8. 请解释下 Spring 框架中的 IoC?
- Spring 中的
org.springframework.beans
包和org.springframework.context
包 构成了 Spring 框架 IoC 容器的基础。 BeanFactory
是 Spring IoC 容器的核心接口,提供了一个先进的配置机制,使得任何类型的对象的配置成为可能。ApplicationContex
接口对 BeanFactory(是一个子接口)进行了扩展,在 BeanFactory 的基础上添加了其他功能,比如与 Spring 的 AOP 更容易集成,也提供了处理 message resource 的机制(用于国际化)、事件传播以及应用层的特别配置,比如针对 Web 应用的 WebApplicationContext。org.springframework.beans.factory.BeanFactory
是 Spring IoC 容器的具体实现, 用来包装和管理前面提到的各种 bean。
9. BeanFactory 和 ApplicationContext 有什么区别
- BeanFactory 可以理解为含有 bean 集合的工厂类,包含了各种 bean 的定义,以便在 接收到客户端请求时将对应的 bean 实例化。
- BeanFactory 还能在实例化对象的时生成协作类之间的关系。可以将 bean 自身与 bean 客户端的配置中解放出来。BeanFactory 还包含 了 bean 生命周期的控制,调用客户端的初始化方法 (initialization methods)和销毁方法(destruction methods)。
- 从表面上看,application context 如同 bean factory 一样具有 bean 定义、bean 关联关系的设置, 根据请求分发 bean 的功能。但 applicationcontext 在此基础上还提供了其他的功能。
- 提供了支持国际化的文本消息
- 统一的资源文件读取方式
- 已在监听器中注册的 bean 的事件
10. ApplicationContext 的常见实现方式
- ClassPathXmlApplicationContext:从 classpath 的 XML 配置文件中读取上下文,并生成上 下文定义。应用程序上下文从程序环境变量中。
ApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");
- FileSystemXmlApplicationContext :由文件系统中的 XML 配置文件读取上下文。
ApplicationContext context = new FileSystemXmlApplicationContext("bean.xml");
- XmlWebApplicationContext:由 Web 应用的 XML 文件读取上下文。
- AnnotationConfigApplicationContext(基于 Java 配置启动容器)