Spring 面试题整理
- 1. Spring 概述
- 2 Spring IOC
- 3 Spring bean
- 3.1 Spring bean 是什么?和 对象有什么区别?
- 3.2 配置 Spring bean 有哪几种方式?
- 3.3 Spring bean 有哪几种作用域?
- 3.4 单例 bean 的优势?
- 3.5 Spring bean 是线性安全的吗?
- 3.6 Spring 如何处理并发问题?
- 3.7 实例化 bean 有哪几种方式?
- 3.8 什么是 bean 的装配, 什么是 bean 的自动化装配?
- 3.9 自动注入有什么限制吗?
- 3.10 自动化装配的方式有几种?
- 3.11 bean 的生命周期回调方法和执行顺序?
- 3.12 Spring 加载过程中 Bean 有哪几种形态?
- 3.13 Bean 的生命周期?
- 3.14 Spring 如何解决 Bean 的循环依赖?
- 3.15 Spring 如何避免在并发的情况下获取不完整的 bean?
- 3.16 BeanDefinition 的加载过程?
- 3.16 如何在所有 BeanDefinition 注册完后做扩展?
- 3.17 Spring 容器启动时,为什么要先加载 BeanFactoryPostProcess?
- 3.18 Bean 的生产顺序时由什么来决定的?
- 4 Spring AOP
- 5 Spring cloud
1. Spring 概述
1.1 什么是 Spring?
Spring 是 java 企业级应用的开源开发框架, Spring主要用来开发Java应用,但是有些扩展是针对构建J2EE平台的 web 应用。Spring 框架目标是简化Java企业级应用开发,并通过POJO为基础的编程模型促进良好的编程习惯。
1.2 为什么使用 Spring ?
使用 Spring 的原因大致有七个:
- 轻量:Spring 是轻量的,基本的版本大约2MB。
- 控制反转:Spring 通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
- 面向切面的编程(AOP):Spring 支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
- 容器:Spring 包含并管理应用中对象的生命周期和配置。
- MVC框架:Spring 的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
- 事务管理:Spring 提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
- 异常处理:Spring 提供方便的API把具体技术相关的异常(比如由JDBC,Hibernate or JDO抛出的)转化为一致的 unchecked 异常。
1.3 Spring 由哪些模块组成?
Spring 框架由大约20个功能模块组成。 这些模块分为核心容器,数据访问/集成,Web,AOP(面向方面的编程),工具,消息传递和测试,如下图所示。
1.3.1 Core Container
-
spring-core;
-
spring-beans;
-
spring-context, spring-context-support;
-
spring-expression(Spring Expression Language);
spring-core 和 spring-beans 模块提供了框架的基本部分,包括 IoC 和依赖注入功能。BeanFactory 是一个复杂的工厂模式的实现。 它消除了编程单例的需要(程序员不必对单例亲力亲为),并允许你从实际的程序逻辑中分离依赖性的配置和规范。
1.3.2 spring-aop
提供了一个符合 AOP Alliance-compliant 的面向方面的编程实现,允许你定义例如方法拦截器和切入点来干净地解耦实现应该分离的功能的代码。 使用源代码级元数据功能,你还可以以类似于 .NET 属性的方式将行为信息合并到代码中。
1.3.3 Data Access/Integration
数据访问/集成
-
JDBC:模块提供了一个 JDBC 抽象层,消除了对繁琐的 JDBC 编码和解析数据库供应商特定的错误代码的需要;
-
ORM:模块为流行的对象关系映射 API 提供集成层,包括 JPA 和 Hibernate 。使用 spring-orm 模块,您可以使用这些 O / R 映射框架结合 Spring 提供的所有其他功能,例如前面提到的简单声明式事务管理功能。
-
OXM:模块提供了一个支持 对象/ XML 映射实现的抽象层,例如JAXB,Castor,JiBX和 XStream;
-
JMS:模块(Java消息服务) 包含用于生成和使用消息的功能 。从 Spring Framework 4.1 开始,它提供了与 spring-messaging 模块的集成;
-
Transaction:模块支持实现特殊接口的类以及所有 POJO (普通 Java 对象)的编程和声明事务管理 。
1.3.4 Web
由 spring-web , spring-webmvc 和 spring-websocket 模块组成。( 注:这里和4的文档比少了spring-webmvc-portlet模块 )
-
spring-web 模块提供基本的面向 Web 的集成功能,例如多部分文件上传功能和使用 Servlet 侦听器和面向 Web 的应用程序上下文来初始化 IoC 容器。 它还包含一个 HTTP 客户端和 Web 的相关部分的 Spring 的远程支持。
-
spring-webmvc 模块(也称为 Web-Servlet 模块)包含用于 Web 应用程序的 Spring 的模型视图控制器(MVC)和REST Web服务实现。 Spring 的 MVC 框架提供了 domain model (领域模型)代码和 Web 表单之间的清晰分离,并且集成了 Spring Framework 所有的其他功能。
1.3.5 Test
spring-test 模块支持使用 JUnit 或 TestNG 对 Spring 组件进行单元测试和集成测试。 它提供了 SpringApplicationContexts 的一致加载和这些上下文的缓存。 它还提供了 mock objects(模拟对象),您可以使用它来单独测试您的代码
1.4 BeanFactory 介绍
BeanFactory 是工厂模式的一个实现,提供了控制反转功能,用来把应用的配置和依赖从正真的应用代码中分离。最常用的BeanFactory 实现是XmlBeanFactory 类。根据XML文件中的定义加载beans。该容器从XML 文件读取配置元数据并用它去创建一个完全配置的系统或应用。
2 Spring IOC
2.1 Spring IOC 是什么?
在 JAVA 编程中,对象需要我们手动创建、管理、回收,但是在 Spring 中,我们只需定义对象,这个对象有点特殊,叫做 bean;Spring IOC 会 根据 bean 定义 ,负责创建为对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。无需我们关心,从而降低代码的耦合度,简化开发。
2.2 Spring IOC 作用和优点
Spring IOC 称为 控制反转, 实际上是根据 bean 的定义来创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期。这整个过程符合依赖倒置设计原则,从而降低代码的耦合度,资源统一管理,无需我们关心,简化开发。
2.3 Spring IOC 实现机制
Spring 实际上使用了 工厂模式和反射机制来实现对 bean 的创建、管理。可以把 IOC 容器看作是一个工厂,这个工厂里要生产的对象都在配置文件中给出定义,然后利用编程语言的的反射编程,根据配置文件中给出的类名生成相应的对象。从实现来看,IOC是把以前在工厂方法里写死的对象生成代码,改变为由配置文件来定义,也就是把工厂和对象生成这两者独立分隔开来,目的就是提高灵活性和可维护性。