Java教程

经典面试题41-50

本文主要是介绍经典面试题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不起作用了

  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语句依赖于数据库,导致数据库移植性差,不能随意更换数据库
这篇关于经典面试题41-50的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!