Java面试题整理(Spring,Spring Mvc)
90、为什么要使用spring?
1、简介
- 目的:解决企业应用开发的复杂性
- 功能:适应基本的JavaBean代替EJB,并提供了更多的企业应用功能
- 范围:任何Java应用
简单来说,spring是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。
2、轻量
从大小和开销两方面而言Spring都是轻量的。完整的SPringle框架可以在一个大小只有1MB多的JAR文件李发布。并且Spring所需的处理开销也是微不足道。此外,Spring是非入侵式的:典型的,SPring应用中的对象不依赖于SPring的特定类。
3、控制反转
当应用了IOC,一个对象以来的其他对象会通过被动的方式传递进来,而不是这个对象自己创建或者查找依赖对象。
4、面向切面
SPring提供了面向切面编程的支持,允许通过分离应用的业务逻辑与系统级服务(例如审计(auditing)和事务(transaction)管理)进行内聚的开发。应用对象只实现他们应该做的,完成业务逻辑,仅此而已。他们并不负责(甚至式意识)其他系统级的关注点,例如日志和事务的支持。
5、容器
Spring包含并管理应用对象的配置和生命周期,在这个意义上它是一种容器。
6、框架
Spring可以将简单的组件配置、组合成复杂的应用。在Spring中,应用对象被声明式的组合,典型的实在一个xml文件里。spring也提供了很多基础功能(事务管理,持久化框架集成等等),将应用的逻辑开发留给了你。
所有Spring的这些特征使你能够编写更干净,更可管理,并且易于测试的代码。他们也为SPring中的各种模块提供了基础支持。
91、解释一下什么是aop?
它利用的一种称为"横切"的技术,剥解开封装的对象内部,并将那些影响了多个类的公共行为文庄到一个可重用模块,并将其命名为”Aspct“,切面。简单来说,就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的可操作性和可维护性。AOP代表的是一个横向的关系,如果说"对象"是一个空心的圆柱体,其中封装的是对象的属性和行为;那么面向切面编程的方法,就仿佛一把利刃,将这些空心圆柱体抛开,以获得其内部的消息。而剥开的切面,也就是所谓的”切面“了。
使用”横切“技术,AOP把软件系统分为了两个布恩:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各种都基本相似。比如权限认证,日志,事务处理。Aop的作用在于分离系统的各种关注点,将核心关注点和横切关注点分离开来。
92、解释一下什么是ioc
没用使用ioc之前:对象A依赖与对象B,那么在对象A在初始化或者运行到某一点的时候,自己必须主动创建对象B或者使用已经创建的对象B。无论是创建还是使用对象B,控制权都在自己手上。
使用IOC容器后,A和B失去了直接联系,当对象A运行到需要对象B的时候,IOC容器会主动创建一个对象B注入到对象A需要的地方。
通过前后的对比,对象A获得依赖对象B的过程,由主动行动变成了被动行为,控制权颠倒过来了,这就是控制反转这个名称的由来。
93、SPringle有哪些主要模块?
容器、数据访问/集成、Web、AOP(面向切面编程)、工具、消息和测试模块。
94、spring常用的注入方式有哪些?
SPring通过DI(依赖注入)实现IOC(控制反转),常用的注入方式主要有三种:
- 构造方法注入
- setter注入
- 基于注解的注入
95、spring中的bean是线程安全的吗?
不具备
96、spring支持几种bean的作用域?
- singleton:单例模式
- prototype:原型模式
- request
- session
- globalsession
97、spring自动装配bean有哪些方式?
- 隐式的bean发现机制和自动装配
- 在java代码或者xml中进行显示配置
当然这些方式可以配合使用
98、spring事务实现方式有哪些?
- 编程式事务管理对基于 POJO 的应用来说是唯一选择。我们需要在代码中调用beginTransaction()、commit()、rollback()等事务管理相关的方法,这就是编程式事务管理。
- 基于 TransactionProxyFactoryBean 的声明式事务管理
- 基于 @Transactional 的声明式事务管理
- 基于 Aspectj AOP 配置事务
99、说一下spring的事务隔离?
事务隔离级别指的是一个事务对数据的修改与另一个并行的事务的隔离程度,当多个事务同时访问相同数据时,如果没有采取必要的隔离机制,就可能发生以下问题:
- 脏读:一个事务读到另一个事务未提交的更新数据。
- 幻读:例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好像发生幻觉一样。
- 不可重复读:比方说在同一个事务中先后执行两条一摸一样的select语句,期间在此次事务中没有执行过任何DDL语句,但先后得到的结果不一致,这就是不可重复读。
100、说一下spring mvc运行流程?
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8bVtjsh7-1594044558154)(C:\Users\ML\AppData\Roaming\Typora\typora-user-images\image-20200706161706442.png)]
1.用户向服务器发送请求,请求被Spring前端控制Servlet DispatcherServlet捕获;
2.DispatcherServlet对请求URL进行解析,得到请求资源标识符(url).然后根据该URL,调用HandlerMapping获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后HandlerExecutionChain对象的形式返回;
3.DispatcherServlet根据获得的Handler,选择一个合适的HandlerAdapter
4.提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。在填充Handler的入参过程中,根据你的配置,SPringle将帮你做一些额外的工作:
- HttpMessageConveter:将请求信息(如json,xml等数据)转换成一个对象,将对象转换为指定的相应信息
- 数据转换:对请求消息进行书转换。如String转换成Integer、Double等
- 数据根式化:对请求消息进行数据格式化。如将字符串转换成格式化数字或格式化日期等
- 数据验证:验证数据的有效性(长度,格式等),验证结果储存到BindingResult或Error中
5.Handler执行完成后,向DispatcherServlet返回一个ModelAndView对象。
6.根据返回的ModelAndView,选择一个合适的 ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet;
7.viewResolver结合Model和View,来渲染视图;
8.将渲染结果返回给客户端。
101、spring mvc有哪些组件
SpringMvc的核心组件:
- DispatcherServlet:中央控制器,把请求抓发给具体的控制类
- Controller:具体的处理请求的控制器
- HandlerMapping:映射处理器,负责映射中央处理器转发给controller时的映射策略
- ModelAndView:服务层返回的数据和视图层的封装类
- ViewResolver:视图解析器,解析具体的试图
- Interceptors:拦截器,负责拦截我们定义的请求然后处理工作
102、@RequestMapping的作用是什么?
RequestMapping是一个用来处理请求地址映射的注解,可用于类或方法上。用于类上,表示类中的多有响应请求的方法都是以该地址作为父路径。
RequestMapping注解有六个属性,下面我们把她分为三类进行说明
value,method:
- value:指定请求的实际地址
- method:指定请求的method类型,GET、POST、POT、DELETE等;
consumes,produces
- consumes:指定处理请求的提交内容类型(Content-Type),例如application/json, text/html;
@RequestMapping(value = "/pets", method = RequestMethod.POST, consumes="application/json")
- produces:指定返回的内容类型,仅当request请求头中的(Accept)类型中包含该指定类型白返回;
@RequestMapping(value = "/pets/{petId}", method = RequestMethod.GET, produces="application/json")
params,henders
- params:指定request中必须包含某些参数值时,才让该方法处理
@RequestMapping(path = "/login", params={"username=kolbe","password=123456"})
<a href="user/login?username=kolbe&password=123456">User Login</a>
- headers:指定request中必须包含某些特定的header请求头值,采访该方法处理请求
@RequestMapping(path = "/login", headers="Host=localhost:8080")
103、@Autowired的作用是什么?
@Autowired依赖注入