经典面试题41-50
作者:互联网
41. Spring事务传播机制
REQUIRED(Spring默认的事务传播类型):如果当前没有事务,则自己新建一个事务,如果当前存在事务,则加入这个事务
SUPPORTS:当前存在事务,则加入当前事务,如果没有事务,则以非事务的方法执行
MANDATORY:当前存在事务,则加入当前事务,如果当前事务不存在,则抛出异常
REQUIRES_NEW:创建一个新事务,如果存在当前事务,则挂起该事务
NOT_SUPPORTED:以非事务方式执行,如果存在事务,则挂起该事务
NEVER:不使用事务,如果当前事务存在,则抛出异常
NESTED:如果当前事务存在,则在嵌套事务中执行,否则开启一个新事务
NESTED和REQUIRES_NEW的区别:
REQUIRES_NEW是新建一个事务,开启的这个事务与当前的事务(父事务)无关,而NESTED是当前存在事务会开启一个嵌套事务(子事务),在NESTED情况下父事务回滚时,子事务也会回滚,而REQUIRES_NEW情况下,原事务回滚不会影响开启的事务
NESTED和REQUIRED的区别
REQUIRED的情况下,调用方法存在事务时,则被调用乙方使用同一个事务,被调用方出现异常时,因为使用的是同一个事务,则两方都会回滚,而NESTED情况下,被调用方发生异常时,调用方可以catch捕获其异常,使得调用方不受影响
42. Spring事务什么时候会失效
Spring事务的原理是AOP,进行切面加强,失效的根本原因是这个AOP不起作用了
-
发生自调用的时候,类里面使用this调用本类的方法会失效,因为这个this对象不是代理类,而是UserService对象本身。解决方法:让this变成UserService的代理类
-
方法不是public的
@Transaction 只能用在public的方法上,否则事务会失效,如果要用在非public方法上,可以开启ASpectJ代理模式
- 数据库不支持事务
- 没有被Spring管理
- 异常被吃掉,事务不会回滚
43. 什么是Bean的自动装配,有哪些方式
开启自动装配,只需要在xml配置文件
<bean id="cutomer" class="com.xxx.....Customer" autowire="" />
autowire属性有五种装配方式:
-
no - 缺省不写的情况下,自动装配是通过ref属性手动装配
- 手动装配:以 value 或 ref 的方式明确指定属性值
- 需要通过 ref 来连接 bean
-
byName - 根据bean的属性名称自动装配
-
Customer 的属性名称是person,Spring会将bean id 为person的bean通过setter方法进行自动装配 <bean id="cutomer" class="com.xxx.....Customer" autowire="byName" /> <bean id="person" class="com.xxx.....Person" />
-
byType - 根据bean的类型进行自动装配
-
Customer 的属性person的类型为Person,Spring会将Person类型通过setter方法进行自动装配 <bean id="cutomer" class="com.xxx.....Customer" autowire="byType" /> <bean id="person" class="com.xxx.....Person" />
-
constructor - 类似byType,不过是应用于构造器的参数。如果一个bean与构造器参数的类型相同,则进行自动装配,否则导致异常
-
Customer 构造函数的参数person的类型为Person,Spring会将Person类型通过构造方法方法进行自动装配 <bean id="cutomer" class="com.xxx.....Customer" autowire="constructor " /> <bean id="person" class="com.xxx.....Person" />
-
autodetect - 如果有默认的构造器,则通过constructor方式进行自动装配,否则使用byType方式进行自动装配
-
使用注解的方式自动装配bean @Autowire,可以在字段、setter方法、构造函数上使用。
44. Spring Boot、Spring MVC 和 Spring 有什么区别
Spring 是一个IOC 容器 ,用来管理Bean,使用依赖注入实现控制反转,可以让程序降低耦合,可以很方便的整合各种框架,提供AOP机制,来弥补了OOP代码重复问题、更方便将不同类不同方法中的共同处理抽取成切面,自动注入给方法执行
Spring MVC 是Spring对web框架的一个解决方案,提供了一个总的前端控制器Servlet,用来接收请求,定义了一整套路由策略以及适配器执行handle,将handle结果会使用视图解析技术生成视图展现给前端
Spring Boot 是Spring 提供的一个快速开发工具包,让程序员能更方便、更快速的开发 Spring + Spring MVC 应用,简化了配置,整合了一系列的解决方案、redis、nongodb、es,可以开箱即用
45. Spring MVC的工作流程(高频)
- 用户发送请求至前端控制器DispatcherServlet
- DispatcherServlet收到请求调用HandlerMapping处理器映射器
- 处理器映射器找到具体的处理器,生成处理器及处理器拦截器一并返回给DispatcherServlet
- DispatcherServlet调用HandlerAdapter处理器适配器
- HandlerAdapter经过适配器调用具体的处理器
- Controller 执行完成返回ModelAndView
- HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
- DispatcherServlet将ModelAndView传给ViewResolver视图解析器
- ViewResolver解析后返回具体View
- DispatcherServlet根据View进行渲染视图
- DispatcherServlet响应用户
46. Spring MVC的主要组件
Handler:也就是处理器。它直接应对着MVC中的C也就是Controller层,他的具体表现形式有很多,可以是类,也可以是方法。在Controller层中@RequestMapping标注的所有的方法都可以看成是一个Handler,只要可以实际处理请求就可以是Handler
- HandlerMapping:initHandlerMappings(context),处理器映射器,根据用户请求的资源URL来查找Handler。在SpringMVC中会有很多请求,每个请求都需要一个Handler处理,具体接收到一个请求之后使用哪个Handler进行,这就是HandlerMapping要做的事。总结:HandlerMapping是用来处理接收到来自用户的请求选择哪个Handler去执行
- HandlerAdapter:initHandlerAdapters(context) ,适配器。因为SpringMVC中的Handler可以是任意的形式,只要能处理请求就ok,但是Servlet 需要的处理方法的结构却是固定的,都是以request和response为参数的方法。如何让固定的Servlet处理方法调用灵活的Handler来进行处理呢?这就是HandlerAdapter要做的事情。 Handler是用来干活的工具:HandlerMapping用于根据需要干的活找到相应的工具;HandlerAdapter是使用干活工具的人。
- HandlerExceptionResolver:用来处理异常的。根据异常设置ModeAndView,之后再交给render方法进行渲染
- ViewResolver:ViewResolver需要找到渲染所用的模板和所用的技术进行渲染,具体的渲染过程会交由不同的视图自己完成。
- RequestToViewNameTranslator:因为有的Handler处理完成后并没有设置View也没有设置ViewName,这时候就需要RequestToViewNameTranslator从request中获取ViewName,RequestToViewNameTranslator在SpringMVC容器中只可以配置一个,所以所有的request到ViewName的转换规则都要在一个Translator里面全部实现
- LocalResolver:基于不同的语言做不同的国际化转换
- ThemeResolver:主题,存放这主题相关的所有资源,获取不同主题的资源,设置对应的主题
- MultipartResolver:用来处理文件上传请求
- FlashMapManager:用来管理FlashMap,FlashMap主要用在redirect中传递参数
47. Spring Boot 自动配置原理(高频)
详情请看:https://blog.csdn.net/wkwk12345/article/details/108028470
- 通过注解:@SpringBootApplication=>@EnableAutoConfiguration(用来获取需要配置的类,并注入进IOC容器中)=>@Import({AutoConfigurationImportSelector.class})实现自动装配
- AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类
- 通过Spring提供的SpringFactoriesLoader机制,扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类
- 依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配
48. 如何理解Spring Boot 中的Starter
使用Spring+SpringMVC时,如果需要引入Mybatis等框架,需要到xml中定义Mybatis需要的bean
starter就是定义一个starter的jar包,写一个@Configuration配置类、将这些bean定义在里面,然后在starter包的META-INF/spring.factories中写入该配置类,springboot就会按照约定来加载该配置类
开发人员使用起来只需要将相应的starter包依赖进应用,进行相应的属性配置。
49. 什么是嵌入式服务器?为什么要使用嵌入式服务器?
节省了下载安装Tomcat,应用也不需要打war包,然后放到webapp目录下再运行
只需要安装了java的虚拟机,就可以直接在上面部署应用程序了
springboot已经内嵌了tomcat.jar,运行main方法时会去启动tomcat,并利用Tomcat的spi机制加载SpringMVC
50. Mybatis的优缺点
优点:
- 基于SQL语句编程,相当灵活,不会对应用程序或者数据库现有的设计造成任何影响,SQL写在XML文件里,解除了sql与程序代码的耦合,便于统一管理,提供xml标签,支持编写动态SQL语句,并可重用
- 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接
- 很好的与各种数据库兼容
- 能够与Spring很好的集成
- 提供映射标签,支持对象与数据库ORM字段关系映射,提供对象关系映射标签,支持对象关系组件维护
缺点:
- SQL语句的编写工作量大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求
- SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
标签:装配,面试题,Spring,事务,50,bean,Handler,自动,41 来源: https://www.cnblogs.com/zhou1072815694/p/16127867.html