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
更多推荐
【高频java面试题】Spring、SpringMVC和Springboot的区别
发布评论