常见面试题-Spring / Spring MVC

1.为什么要使用Spring

  • 简介

目的:解决企业应用开发的复杂性

功能:使用基本的JavaBean代替EJB,并提供更多的企业应用功能

范围:任何Java应用

Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架

  • 轻量

大小:完整spring框架可以在一个大小只有1mb多的jar文件里发布

开销:spring所需的处理开销微不足道,spring是非侵入式的,因为spring应用中的对象不依赖spring的特定类

  • 控制反转

spring通过该技术实现松耦合。当应用了IoC,一个对象依赖的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找。IoC与JNDI相反,不是对象从容器中查找依赖,而是容器在对象初始化时不需要对象请求就主动将依赖传递

  • 面向切面

spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务(如:审计、事务、日志管理)进行内聚性的开发。应用对象只负责专心完成业务逻辑即可,并不负责其他的系统级关注点

  • 容器

spring包含并管理应用对象的配置和生命周期,因此它是一个容器,程序员可以配置每个bean如何被创建——基于一个可配置原型(prototype),bean可以创建一个单独的实例或者每次需要时都生成一个新的实例——以及它们是如何相互关联的。

  • 框架

spring可将简单的组件配置组合成复杂的应用。在spring中,应用对象被声明式地组合,最典型的就是在xml文件中。spring也提供很多基础功能,尽可能只将应用逻辑的开发留给程序员

2.oop和aop的区别

  • oop:object-oriented programming,面向对象编程

oop引入封装、继承和多态等概念来建立一种对象层次结构,用来模拟公共行为的一个集合。但当需要为分散的对象引入公共行为时,oop则显得无能为力。oop允许定义从上到下的关系,但并不适合定义从左到右的关系。对于像安全性、异常处理和日志处理等代码,在oop设计中会产生大量重复代码,不利于各模块的重用

  • aop:aspect-oriented programming,面向切面编程,是oop的补充和完善

利用称为“横切”的技术,剖解封装对象的内部,并将那些影响多个类的公共行为封装到一个可重用模块,起名为Aspect(切面)。将业务模块共用的逻辑封装,便于减少系统的重复代码,降低模块间的耦合度,利于系统的可操作性和可维护性。

aop将软件系统分为两个部分:

核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处都基本相似。比如权限认证、日志、事务处理。Aop 的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。正如Avanade公司的高级方案构架师Adam Magee所说,AOP的核心思想就是“将应用程序中的商业逻辑同对其提供支持的通用服务进行分离。”

3.什么是ioc

 ioc:Inversion of Control,控制反转,使对象获得依赖对象的行为由之前的主动,变为现在的被动,控制权颠倒了。

ioc理论观点:借助”第三方“实现具体依赖关系的对象之间的解耦

上图中,因此ioc容器,使a、b、c、d这4个对象没有了耦合关系,齿轮之间的传动全部依靠”第三方“,对象的控制权全都上缴给”第三方“ioc容器。使ioc容器称为整个系统的关键核心,并起到”粘合剂“的作用,把系统所有对象粘合在一起,如果没有ioc,系统中对象与对象之间会彼此失去联系

4.spring有哪些主要模块

spring框架的模块主要分为:核心容器、数据访问/集成、web、aop、工具、消息和测试模块

5.spring常用的注入方式

spring通过DI(依赖注入)实现IoC(控制反转),常用的注入方式主要有三种:

  • 构造方法注入
  • setter方法注入 / 属性注入
  • 基于注解注入

6.spring中bean是线程安全的吗

spring容器本身没有提供bean的线程安全策略,因此spring容器中bean本身不具备线程安全的特性,具体得看bean的scope(作用域)

7.spring支持几种bean的作用域

通过spring容器创建bean实例时,不仅可以完成bean实例的实例化,还可指定bean的作用域,bean的作用域支持5种:

  • singleton:单例模式,在整个spring ioc 容器中,使用singleton定义的bean都将只有一个。容器会跟踪bean实例的状态,维护bean实例的生命周期行为
  • prototype:原型模式,通过prototype定义的bean,每次容器的getBean方法获取时,都会产生一个新的bean实例,一旦创建成功,容器不再跟踪实例,也不会维护bean实例状态
  • request:每次http请求多会产生不同的bean实例。只有在web应用中使用spring时,该作用域才有效
  • session:每次http session都将产生一个新的bean实例。只有在web应用中使用spring时,该作用域才有效
  • globalsession:每个全局的http session都会产生一个新的bean实例。
  • 典型情况下,仅在使用portlet context的时候有效。同样只有在Web应用中使用Spring时,该作用域才有效

8.spring自动装配bean的方式

  • 隐式的bean发现机制和自动装配
  • 在java代码或者xml中显示配置

9.spring事务实现方式

  • 编程式事务管理:编程式事务管理对基于pojo的应用来说是唯一选择。我们需要在代码中编写beginTransaction()、commit()、rollback()等事务管理相关的方法代码
  • 基于注解@Transactional的声明式事务管理
  • 基于TransactionProxyFactoryBean的声明式事务管理
  • 基于Aspectj AOP配置事务

10.spring的事务隔离

事务隔离级别是指:一个事务进行数据的修改对另一个并行的事务的影响程度。当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,会发生一下问题:

  • 脏读:一个事务读到另一个事务未提交的更新数据
  • 不可重复读:在同一事务中先后执行两条一模一样的select语句,而且期间此事务没有执行过任何ddl语句,最终两次select结果不一致
  • 幻读:A事务对数据库的所有数据进行修改操作,B事务对数据库进行插入操作,操作结束后,A事务会发现还有一条数据没有修改,这就是幻读

11.spring mvc的运行流程

spring mvc运行流程图:

流程描述:

  1. 用户向服务器发送请求,请求被spring mvc的前端控制DispatcherServlet铺获
  2. DispatcherServlet对请求url进行解析,得到请求资源表示符uri。根据uri调用HandlerMapping获得该handler配置的所有相关对象,包括handler对象以及handler对象对应的拦截器,最后以HandlerExecutionChain对象的形式返回
  3. DispatcherServlet根据获得handler,选择一个何使的HandlerAdapter,如果成功获得HandlerAdapter,将开始执行拦截器的preHandler()方法
  4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在向Handler填充入参过程中,spring会根据配置进行额外的工作:
    1. HttpMessageConveter:将请求消息(如json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
    2. 数据转换:对请求信息进行数据转换。如String转换成Integer、Double等
    3. 数据格式化:对请求信息进行数据格式化。如将字符串转换成格式化数字或格式化日期
    4. 数据验证:验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中
  5. Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象
  6. 根据ModelAndView对象,选择合适的ViewResolver视图解析器(必须是已经注册到spring容器中的ViewResolver)返回给DispatcherServlet
  7. ViewResolver结合Model和View,进行渲染视图
  8. 将渲染结果返回给客户端

12.spring mvc的核心组件

  • DispatcherServlet:中央控制器,将请求转发到具体的控制器
  • Controller(Handler):具体处理请求的控制器
  • HandlerMapping:映射处理器,负责映射中央处理器转发给控制器时的映射策略
  • ModelAndView:服务层返回数据和视图层数据的封装类
  • ViewResolver:视图解析器,解析具体视图
  • Interceptors:拦截器,负责拦截请求,并进行特定的处理工作

13.@RequestMapping的作用

用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的所有响应请求的方法都是该地址作为父路径

@RequestMapping的属性:

  • value,method

value:指定请求的实际地址,指定的地址可以是URI Template模式

method:指定请求的method类型,如GET、POST、PUT、DELETE

  • consumes,produces

consumes:指定处理请求的提交内容类型(Content-Type),如application/json,text/html

produces:指定返回的内容类型,仅当request请求头中的Accept属性包含produces类型时才返回

  • params,headers

params:指定request中必须包含某些参数值时,才让该方法处理

headers:指定request中必须包含某些指定的header值,才让该方法处理

14.拦截器的执行流程

  • 当前置方法preHandler返回为false,程序直接结束,其他方法不再执行
  • 当前置方法preHandler返回为true时,先执行处理器(Controller类)方法 ——> 执行拦截器postHandler方法 ——> 视图解析和渲染 ——> 执行拦截器afterCompletion方法 ——> 结束

15.拦截器链的执行流程

  • 正常情况:先顺序执行拦截器的preHandler,后执行Controller类中方法,再倒序执行拦截器的postHandler,最后倒序执行拦截器的afterCompletion
  • 顺序执行拦截preHandler时,有一个拦截器返回false,剩下的拦截器都不会执行preHandler,所有拦截器postHandler不会执行,然后倒序执行preHandler方法返回为true的拦截器的afterCompletion
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值