首页 > 编程知识 正文

面试官问springboot和springmvc的区别,spring和springmvc面试题常问

时间:2023-05-06 16:27:41 阅读:284436 作者:2656

1、问?)Spring、SpringMVC和Springboot的区别

背景!

相关概念

1)、何为Spring?

Spring是一个轻量级的DI/IOC和AOP容器的开源框架;

Spring提倡以“最少侵入”的方式来管理应用中的代码;

优势:

低侵入 / 低耦合 (降低组件之间的耦合度,实现软件各层之间的解耦)声明式事务管理(基于切面和惯例)方便集成其他框架(如MyBatis、Hibernate等)降低 Java 开发难度Spring 框架中包括了 J2EE 三层的每一层的解决方案(一站式)

2)、何为SpringMVC?

SpringMVC 是Spring的一个模块,基于MVC的一个框架,无需中间层来整合,用于替代Servlet。SpringMVC= struts2+spring.SpringMVC 相当于是Struts2加上Spring的整合

优势:

基于组件技术,全部的应用对象,无论是控制器和视图,还是业务对象之类的都是Java组件,并且和Spring提供的其他基础结构紧密集成。不依赖于Servlet API。可以任意使用各种视图技术,而不仅仅局限于JSP。支持各种请求资源的映射策略。易扩展

3)、何为SpringBoot?

SpringBoot是一个快速开发的框架,能过快速整合第三方框架,整合的基本原理是Maven依赖关系,Maven的集成,完全采用注解化,简化XML配置,内嵌HTTP服务器(Tomcate,jetty),默认嵌入Tomcat,最终以Java应用程序进行执行。

2、问?)SpringMVC的请求过程?

------------问题:

a、典型的应用程序中可能会有多个控制器,这些请求到底应该发给哪一个控制器呢?

DispatcherServlet会查询一个或多个处理器映射来确定请求的下一站在哪里,处理器映射会根据请求所携带的URl 信息来进行决策。

b、SpringMVC的控制器是不是单例模式?如果是,有什么问题?怎么解决?

是单例模式,所以在多线程访问的时候有线程安全问题,注意不要用同步,会影响性能,解决方案是在控制器里面不能写字段

 

3、问?)Spring中运用了哪些设计模式?

工厂模式 : Spring使用工厂模式通过 BeanFactory、ApplicationContext 创建 bean 对象。

代理模式 : Spring AOP 功能的实现。

单例模式 : Spring 中的 Bean 默认都是单例的。

模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 结尾的对数据库操作的类,它们就使用到了模板模式。

包装器设计模式 : 我们的项目需要连接多个数据库,而且不同的客户在每次访问中根据需要会去访问不同的数据库。这种模式让我们可以根据客户的需求能够动态切换不同的数据源。

观察者模式: Spring 事件驱动模型就是观察者模式很经典的一个应用。

适配器模式 :Spring AOP 的增强或通知(Advice)使用到了适配器模式、spring MVC 中也是用到了适配器模式适配Controller。

……

4、问?)事务的传播属性有哪些?

事务的属性

1   propagation用来设置事务的传播行为

事务的传播行为:一个方法运行在了一个开启事务的方法中,当前方法是使用依附的方法事务还是使用自身的事务

Propagation.REQUIRED默认值 使用其依附的别人方法的事务

Propagation.REQUIRES_NEW 将原来的事务挂起  开启一个新的事务(即执行自身的事务)

使用方法   在需要使用事务的方法上加注解   @Transactional 什么都不加默认为Propagation.REQUIRED

若想开启新事务执行自己的事务则可以在方法上加@Transactional(propagation=Propagation.REQUIRES_NEW)

2   isolation用来设置事务的隔离级别

Oracle支持的事务隔离级别为   

默认读已提交read committed   串行化 serializable 

Mysql支持所有的事务隔离级别 

  读未提交  read uncommitted      读已提交 read commited (默认)可重复读 repeatable  read 串行化 serializable            

 同传播行为一样 也是在注解@Transaction()中添加 (isolation=Isolation.DEFAULT)

SQL Server 默认系统事务隔离级别是

read committed,读已提交

Spring事务七大传播机制与五个隔离级别

----------------------------------------------------------------Spring事务七大传播机制--------------------------------------------

七大传播机制

1、propagation_required

当前方法必须在一个具有事务的上下文中运行,如有客户端有事务在进行,那么被调用端将在该事务中运行,否则的话重新开启一个事务。(如果被调用端发生异常,那么调用端和被调用端事务都将回滚)

2、propagation_supports

当前方法不必需要具有一个事务上下文,但是如果有一个事务的话,它也可以在这个事务中运行

3、propagation_mandatory

表示当前方法必须在一个事务中运行,如果没有事务,将抛出异常

4、propagation_nested

如果当前方法正有一个事务在运行中,则该方法应该运行在一个嵌套事务中,被嵌套的事务可以独立于被封装的事务中进行提交或者回滚。如果封装事务存在,并且外层事务抛出异常回滚,那么内层事务必须回滚,反之,内层事务并不影响外层事务。如果封装事务不存在,则同propagation_required的一样

5、propagation_never

当方法务不应该在一个事务中运行,如果存在一个事务,则抛出异常

6、propagation_requires_new

当前方法必须运行在它自己的事务中。一个新的事务将启动,而且如果有一个现有的事务在运行的话,则这个方法将在运行期被挂起,直到新的事务提交或者回滚才恢复执行。

7、propagation_not_supported

方法不应该在一个事务中运行。如果有一个事务正在运行,他将在运行期被挂起,直到这个事务提交或者回滚才恢复执行

----------------------------------------------------------------------------Spring事务五大隔离级别-----------------------------------------------------

1、isolation_default

使用数据库默认的事务隔离级别

2、isolation_read_uncommitted

允许读取尚未提交的修改,可能导致脏读、幻读和不可重复读

3、isolation_read_committed

允许从已经提交的事务读取,可防止脏读、但幻读,不可重复读仍然有可能发生

4、isolation_repeatable_read

对相同字段的多次读取的结果是一致的,除非数据被当前事务自生修改。可防止脏读和不可重复读,但幻读仍有可能发生

5、isolation_serializable

完全服从acid隔离原则,确保不发生脏读、不可重复读、和幻读,但执行效率最低

5、问?)事务的隔离机制有哪些?

6、问?)讲讲bean的加载过程?

java 类加载需要以下5个过程

一、加载

加载是类加载的第一个过程,主要完成以下三件事

1、通过一个类的权限定名获取该类的二进制流。

2、将该二进制流中的静态存储结构转换为方法去运行数据结构

3、在内存中生成该类的Class对象,作为该类的数据访问入口

二、验证

验证的目的是为了确保Class文件的字节流中的信息不会危害到虚拟机,在该阶段主要完成以下四种验证

1、文件格式验证:验证字节流是否符合Class文件的规范,如主版本号是否在当前虚拟机范围内,常量池中的常量是否有不被支持的类型

2、元数据验证:对字节码描述的信息进行语义分析,如这个类是否有父类,是否继承了不被继承的类

3、字节码验证:是整个验证过程中最复杂的一个阶段,通过控制验证数据流和控制流的分析,确定程序语义是否正确,主要针对方法体的验证,如:方法中类型转换是否正确,跳转指令是否正确。

4、符号引用验证:这个动作是在后面的解析过程中发生的,主要确保解析动作能正确执行

三、准备

准备阶段是为类的静态变量分配内存,并将其初始化为默认值,这些内存都将在方法区中进行分配,准备阶段不分配类中实例变量的内存,实例变量将会在对象实例化的时候随着对象一起分配到Java堆中。

四、解析

解析阶段主要完成符号引用到直接引用的转换动作,解析动作不一定在初始化动作完成之前,也可能在初始化之后

五、初始化

初始化是类加载的最后一步,前面的类加载过程,除了在加载阶段用户应用程序可以通过自定义类加载器参与之外,其余动作完全由虚拟机主导和控制,到了初始化阶段,才开始真正的执行类中定义的Java程序的代码。

问?7、)说说Struts2和SpringMVC的区别

SpringMVC的入口是一个servlet,即前端控制器,而struts2入口是一个filter过滤器SpringMVC是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或者多例(建议单例),Struts2基于类开发,传递参数是通过类的属性,只能设计为多例Struts2采用值栈存储请求和相应的数据,通过OGNL存取数据,SpringMVC通过参数解析器将request 请求内容解析,并给方法形参赋值,将数据个视图封装成ModelAndView对象,最后将ModelAndView中的模型数据通过request域传输到页面,JSP视图解析器默认使用jstl

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。