ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

经典面试题41-50

2022-04-10 22:32:44  阅读:167  来源: 互联网

标签:装配 面试题 Spring 事务 50 bean Handler 自动 41


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不起作用了

  1. 发生自调用的时候,类里面使用this调用本类的方法会失效,因为这个this对象不是代理类,而是UserService对象本身。解决方法:让this变成UserService的代理类

  2. 方法不是public的

@Transaction 只能用在public的方法上,否则事务会失效,如果要用在非public方法上,可以开启ASpectJ代理模式
  1. 数据库不支持事务
  2. 没有被Spring管理
  3. 异常被吃掉,事务不会回滚

43. 什么是Bean的自动装配,有哪些方式

开启自动装配,只需要在xml配置文件中定义autowire属性

<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的工作流程(高频)

  1. 用户发送请求至前端控制器DispatcherServlet
  2. DispatcherServlet收到请求调用HandlerMapping处理器映射器
  3. 处理器映射器找到具体的处理器,生成处理器及处理器拦截器一并返回给DispatcherServlet
  4. DispatcherServlet调用HandlerAdapter处理器适配器
  5. HandlerAdapter经过适配器调用具体的处理器
  6. Controller 执行完成返回ModelAndView
  7. HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet
  8. DispatcherServlet将ModelAndView传给ViewResolver视图解析器
  9. ViewResolver解析后返回具体View
  10. DispatcherServlet根据View进行渲染视图
  11. DispatcherServlet响应用户

46. Spring MVC的主要组件

Handler:也就是处理器。它直接应对着MVC中的C也就是Controller层,他的具体表现形式有很多,可以是类,也可以是方法。在Controller层中@RequestMapping标注的所有的方法都可以看成是一个Handler,只要可以实际处理请求就可以是Handler

  1. HandlerMapping:initHandlerMappings(context),处理器映射器,根据用户请求的资源URL来查找Handler。在SpringMVC中会有很多请求,每个请求都需要一个Handler处理,具体接收到一个请求之后使用哪个Handler进行,这就是HandlerMapping要做的事。总结:HandlerMapping是用来处理接收到来自用户的请求选择哪个Handler去执行
  2. HandlerAdapter:initHandlerAdapters(context) ,适配器。因为SpringMVC中的Handler可以是任意的形式,只要能处理请求就ok,但是Servlet 需要的处理方法的结构却是固定的,都是以request和response为参数的方法。如何让固定的Servlet处理方法调用灵活的Handler来进行处理呢?这就是HandlerAdapter要做的事情。 Handler是用来干活的工具:HandlerMapping用于根据需要干的活找到相应的工具;HandlerAdapter是使用干活工具的人。
  3. HandlerExceptionResolver:用来处理异常的。根据异常设置ModeAndView,之后再交给render方法进行渲染
  4. ViewResolver:ViewResolver需要找到渲染所用的模板和所用的技术进行渲染,具体的渲染过程会交由不同的视图自己完成。
  5. RequestToViewNameTranslator:因为有的Handler处理完成后并没有设置View也没有设置ViewName,这时候就需要RequestToViewNameTranslator从request中获取ViewName,RequestToViewNameTranslator在SpringMVC容器中只可以配置一个,所以所有的request到ViewName的转换规则都要在一个Translator里面全部实现
  6. LocalResolver:基于不同的语言做不同的国际化转换
  7. ThemeResolver:主题,存放这主题相关的所有资源,获取不同主题的资源,设置对应的主题
  8. MultipartResolver:用来处理文件上传请求
  9. FlashMapManager:用来管理FlashMap,FlashMap主要用在redirect中传递参数

47. Spring Boot 自动配置原理(高频)

​ 详情请看:https://blog.csdn.net/wkwk12345/article/details/108028470

  1. 通过注解:@SpringBootApplication=>@EnableAutoConfiguration(用来获取需要配置的类,并注入进IOC容器中)=>@Import({AutoConfigurationImportSelector.class})实现自动装配
  2. AutoConfigurationImportSelector类中重写了ImportSelector中selectImports方法,批量返回需要装配的配置类
  3. 通过Spring提供的SpringFactoriesLoader机制,扫描classpath下的META-INF/spring.factories文件,读取需要自动装配的配置类
  4. 依据条件筛选的方式,把不符合的配置类移除掉,最终完成自动装配

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有