Java框架面试题及答案(19道常见必考题图解)

Java框架面试题及答案(19道常见必考题图解)-mikechen

Spring体系结构

Spring框架至今已集成了20多个模块,这些模块分布在以下模块中:

  • 核心容器(Core Container)
  • 数据访问/集成(Data Access/Integration)层
  • Web层
  • AOP(Aspect Oriented Programming)模块
  • 植入(Instrumentation)模块
  • 消息传输(Messaging)
  • 测试(Test)模块

Spring体系结构如下图:

Java框架面试题及答案(19道常见必考题图解)-mikechen

 

Spring框架的好处是什么?

  •  轻量:Spring是轻量的,基本的版本大约2MB。
  •  控制反转:Spring通过控制反转实现了松散耦合,对象们给出它们的依赖,而不是创建或查找依赖的对象们。
  •  面向切面的编程(AOP):Spring支持面向切面的编程,并且把应用业务逻辑和系统服务分开。
  •  容器:Spring包含并管理应用中对象的生命周期和配置。
  •  MVC框架:Spring的WEB框架是个精心设计的框架,是Web框架的一个很好的替代品。
  •  事务管理:Spring提供一个持续的事务管理接口,可以扩展到上至本地事务下至全局事务(JTA)。
  •  异常处理:Spring提供方便的API把具体技术相关的异常(比如由JDBC,HibernateorJDO抛出的)转化为一致的unchecked异常。

 

Spring七大功能模块

Spring有七大功能模块,分别是Spring Core,AOP,ORM,DAO,MVC,WEB,Context。

 

怎么理解IOC?

IOC是Inversion of Control的缩写,多数书籍翻译成“控制反转”。

IOC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。

传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试,有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,如下图所示:
Java框架面试题及答案(19道常见必考题图解)-mikechen

上图引入了IOC容器,使得A、B、C、D这4个对象没有了耦合关系,齿轮之间的传动全部依靠“第三方”了,全部对象的控制权全部上缴给“第三方”IOC容器。

所以,IOC借助于“第三方”实现具有依赖关系的对象之间的解耦,使程序更优良。

 

IOC的实现原理

IOC容器其实就是一个大工厂,它用来管理我们所有的对象以及依赖关系。

  • 原理就是通过 Java 的反射技术来实现的,通过反射我们可以获取类的所有信息(成员变量、类名等等等);
  • 再通过配置文件(xml)或者注解来描述类与类之间的关系。

这样我们就可以通过这些配置信息和反射技术来构建出对应的对象和依赖关系了,如下图所示:

Java框架面试题及答案(19道常见必考题图解)-mikechen

 

怎么理解AOP?

AOP (Aspect Orient Programming),直译过来就是 面向切面编程,AOP 是一种编程思想,是面向对象编程(OOP)的一种补充。

面向切面编程,实现在不修改源代码的情况下给程序动态统一添加额外功能的一种技术,如下图所示:
Java框架面试题及答案(19道常见必考题图解)-mikechen
AOP可以拦截指定的方法并且对方法增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离,比如Spring的事务,通过事务的注解配置,Spring会自动在业务方法中开启、提交业务,并且在业务处理失败时,执行相应的回滚策略。

 

Spring AOP的实现原理

Spring的AOP实现原理其实很简单,就是通过动态代理实现的。

Spring AOP 采用了两种混合的实现方式:JDK 动态代理和 CGLib 动态代理。

  • JDK动态代理:Spring AOP的首选方法。 每当目标对象实现一个接口时,就会使用JDK动态代理。目标对象必须实现接口
  • CGLIB代理:如果目标对象没有实现接口,则可以使用CGLIB代理。

 

AOP的应用场景

比如典型的AOP的应用场景:
Java框架面试题及答案(19道常见必考题图解)-mikechen

  • 日志记录
  • 事务管理
  • 权限验证
  • 性能监测

AOP可以拦截指定的方法,并且对方法增强,比如:事务、日志、权限、性能监测等增强,而且无需侵入到业务代码中,使业务与非业务处理逻辑分离。

 

SpringBean的生命周期?

Spring中每个Bean的生命周期如下,主要分为以下8大步骤:

Java框架面试题及答案(19道常见必考题图解)-mikechen

  •   Spring容器从XML文件中读取bean的定义,并实例化bean。
  •  Spring根据bean的定义填充所有的属性。
  •  如果bean实现了BeanNameAware接口,Spring传递bean的ID到setBeanName方法。
  •  如果Bean实现了BeanFactoryAware接口,Spring传递beanfactory给setBeanFactory方法。
  •  如果有任何与bean相关联的BeanPostProcessors,Spring会在postProcesserBeforeInitialization()方法内调用它们。
  •  如果bean实现IntializingBean了,调用它的afterPropertySet方法,如果bean声明了初始化方法,调用此初始化方法。
  •  如果有BeanPostProcessors和bean关联,这些bean的postProcessAfterInitialization()方法将被调用。
  •  如果bean实现了DisposableBean,它将调用destroy()方法。

 

Spring支持的事务管理类型

Spring支持两种类型的事务管理:

  • 编程式事务管理:这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护。
  • 声明式事务管理:这意味着你可以将业务代码和事务管理分离,你只需用注解和XML配置来管理事务。

 

Spring事务支持的隔离级别

Spring 事务上提供以下的隔离级别:

  •  ISOLATION_DEFAULT: 使用后端数据库默认的隔离级别
  •  ISOLATION_READ_UNCOMMITTED : 允许读取未提交的数据变更,可能会导致脏读,幻读或不可重复读
  •   ISOLATION_READ_COMMITTD : 允许读取为提交数据,可以阻止脏读,当时幻读或不可重复读仍可能发生
  •   ISOLATION_REPEATABLE_READ: 对统一字段多次读取结果是一致的,除非数据是被本事务自己修改.可以阻止脏读,不可重复读,但幻读可能发生
  •  ISOLATION_SERIALIZABLE : 完全服从ACID

 

Spring  MVC 模型怎么理解?

可以用如下的图形来表示MVC三者之间的关系:
Java框架面试题及答案(19道常见必考题图解)-mikechen

1.模型(Model)

模型封装了数据及对数据的操作,可以直接对数据库进行访问,不依赖视图和控制器,也就是说模型并不关注数据如何展示,只负责提供数据。GUI 程序模型中数据的变化一般会通过观察者模式通知视图,而在 web 中则不会这样。

2.视图(View)

视图从模型中拉取数据,只负责展示,没有具体的程序逻辑。

3.控制器(Controller)

控制器用于控制程序的流程,将模型中的数据展示到视图中。

 

SpringMVC执行流程是什么?

Java框架面试题及答案(19道常见必考题图解)-mikechen

(1)用户发送请求发送给前端控制器

(2)前端控制器收到请求调用处理器映射器

(3)处理器映射器找到具体得处理器,生成处理器对象以及处理器拦截器并返回给前端控制器

(4)前端控制器调用处理器适配器

(5)处理器适配器经过适配调用具体得处理器

(6)处理器执行完成并返回结果给前端控制器

(7)前端控制器接受到结果,并讲结果传给视图解析器

SpringMVC主要组件?

Java框架面试题及答案(19道常见必考题图解)-mikechen

1)前端控制器(DispatcherServlet)

用户请求到达前端控制器,它就相当于 mvc 模式中的 c,DispatcherServlet 是整个流程控制的中心,由它调用其它组件处理用户的请求,DispatcherServlet 的存在降低了组件之间的耦合性。

 

2)处理器映射器(HandlerMapping)

HandlerMapping 负责根据用户请求找到 Handler 即处理器,springmvc 提供了不同的映射器实现不同的映射方式,例如:配置文件方式,实现接口方式,注解方式等。

 

3)处理器(Handler)

Handler 是继 DispatcherServlet 前端控制器的后端控制器,在 DispatcherServlet 的控制下 Handler 对具体的用户请求进行处理。

由于 Handler 涉及到具体的用户业务请求,所以一般情况需要程序员根据业务需求开发 Handler。

 

4)处理器适配器(HandlAdapter)

通过 HandlerAdapter 对处理器进行执行,这是适配器模式的应用,通过扩展适配器可以对更多类型的处理器进行执行。

 

5)视图解析器(ViewResolver)

ViewResolver 负责将处理结果生成 View 视图,ViewResolver 首先根据逻辑视图名解析成物理视图名即具体的页面地址,再生成 View 视图对象,最后对 View 进行渲染将处理结果通过页面展示给用户。

 

6)视图(View)

SpringMVC 框架提供了很多的 View 视图类型的支持,包括:jstlView、freemarkerView、pdfView 等。

 

SpringBoot是什么?

SpringBoot来简化Spring应用开发,约定大于配置,去繁化简,是 Spring 开源组织下的子项目。

传统的 SSM/SSH 框架组合配置繁琐臃肿,不同项目有很多重复、模板化的配置,严重降低了 Java 工程师的开发效率。

而 Spring Boot 对 Spring 家族和一些第三方库提供一系列自动化配置的 Starter,来使得开发快速搭建一个基于 Spring 的应用程序。

 

SpringBoot的核心注解有哪些?

启动类上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要组合包含了以下 3 个注解:

1)@SpringBootConfiguration

组合了 @Configuration 注解,实现配置文件的功能。

2)@EnableAutoConfiguration

打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。

3)@ComponentScan

Spring组件扫描

 

SpringBoot、Spring MVC和Spring有什么区别?

1)Spring

Spring最重要的特征是依赖注入。所有Spring Modules不是依赖注入就是IOC控制反转,当我们恰当的使用DI或者是IOC的时候,可以开发松耦合应用。

2)Spring MVC

Spring MVC提供了一种分离式的方法来开发Web应用。通过运用像DispatcherServelet,MoudlAndView 和 ViewResolver 等一些简单的概念,开发 Web 应用将会变的非常简单。

3)SpringBoot

Spring和Spring MVC的问题在于需要配置大量的参数,SpringBoot通过一个自动配置和启动的项来解决这个问题。

 

Mybatis架构设计

我们把Mybatis的功能架构分为三层:

  1. API接口层
  2. 数据处理层
  3. 基础支撑层

Java框架面试题及答案(19道常见必考题图解)-mikechen

 

Mybatis核心执行流程

mybatis的总体执行流程,总结如下:

Java框架面试题及答案(19道常见必考题图解)-mikechen

1.MyBatis配置文件

config.xml:配置了全局配置文件,配置了MyBatis的运行环境等信息。

mapper,xml:sql的映射文件,配置了操作数据库的sql语句,此文件需在config.xml中加载。

2.SqlSessionFactory

通过MyBatis环境等配置信息构造SqlSessionFactory(会话工厂)。

3.SqlSession

通过会话工厂创建SqlSession(会话),对数据库进行增删改查操作。

4.Exector执行器

MyBatis底层自定义了Exector执行器接口来具体操作数据库,Exector接口有两个实现,一个基本执行器(默认),一个是缓存执行器,SqlSession底层是通过Exector接口操作数据库。

5.MappedStatement

MyBatis的一个底层封装对象,它包装了MyBatis配置信息与sql映射信息等。mapper.xml中的insert/select/update/delete标签对应一个MappedStatement对象。标签的id就是MappedStatement的id。

MappedStatement对sql执行输入参数进行定义,包括HashMap、基本类型、pojo、Executor通过MappedStatement在执行sql前将输入的Java对象映射至sql中,输入参数映射就是JDBC编程对preparedStatement设置参数。

MappedStatement对sql执行输出结果进行定义,包括HashMap、基本类型、pojo,Executor通过MappedStatement在执行sql后将输出结果映射至Java对象中,输出结果映射就是JDBC编程对结果的解析处理过程。

陈睿mikechen

10年+大厂架构经验,资深技术专家,就职于阿里巴巴、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法