JAVA-04-2023年210道面试题归纳之Java框架(二)(连载中)

65.Spring中的事务是如何实现的

  1. Sprng的事物底层是基于数据库事务和AOP机制的
  2. 首先对于使用了@Transactional注解的Bean,Spring会创建一个代理对象作为Bean
  3. 当调用代理对象的方法时,会先判断该方法上是否加了@Transactional注解
  4. 如果加了,那么则利用事务管理器建立一个数据库连接
  5. 并且修改数据库连接的autocommit属性为false,禁止此连接的自动提交,这是实现Spring事务非常重要的一步
  6. 然后执行当前方法,方法中会执行sql
  7. 执行完当前方法后,如果没有出现异常就直接提交事务
  8. 如果出现了异常,并且这个异常是需要回滚的就会将事务回滚,否则仍然提交事务
  9. Spring事务的隔离级别对应的就是数据库的隔离级别
  10. Spring的传播机制是Spring事务自己实现的,也是Spring中最复杂的
  11. Spring的事务传播机制是基于数据库连接来做的,一个数据库连接一个事务,如果连接机制配置为需要新开一个事务,那么实际上就是先建立一个数据库连接,在此数据看连接上执行sql

66.Spring中什么时候@Transactional会失效

因为Spring事务是基于代理来实现的,所以某个加了@Transactional的方法只有是被代理对象调用时,那么这个注解会失效,所以如果是被代理对象调用了这个方法,那么@Transactional是不会失效的。

同时,如果某个方法时private的,那么@Transactional也会失效,因为底层cglib是基于父子类来实现的,子类是不能重栽父类的private方法,所以无法很好的利用代理,也会导致@Transactional失效

67.Spring容器启动流程是怎样的

  1. 在创建Spring容器,也就是启动Spring时:
  2. 首先会进行扫描,扫描到所有的BeanDefinition对象,并存在一个Map中
  3. 然后筛选出非懒加载的单例BeanDefinition进行创建Bean,对于多例Bean不需要在启动过程中去进行创建,对于多例Bean会在每次获取Bean时利用BeanDefinition去创建
  4. 利用BeanDefinition创建Bean就是Bean的创建生命周期,这期间包括了合并BeanDefinition、并推断构造方法、实例化、属性填写、初始化前、初始化后等步骤,其中AOP就是发生在初始化后这一步骤中
  5. 单例Bean创建完之后,Spring会发布一个容器启动事件
  6. Spring启动结束
  7. 在源码中会更复杂,比如源码中会提供一些模型方法,让子类去实现,如果源码中还涉及到一些BeanFactoryPostProcessor和BeanPostProcessor的注册,Spring的扫描就是通过BeanFactoryPostProcessor来实现的,依赖注入就是通过BeanPostProcessor来实现的
  8. 在Spring启动过程中还会去处理@Import等注解

68.Spring用到了哪些设计模式

  • 工厂模式:
    • BeanFactory
    • FactoryBean
  • 适配器模式:
    • AdvisorAdapter接口,对Advisor进行了适配
  • 访问者模式:
    • PropertyAccessor接口,属性访问器,用来访问后设置某个对象的某个属性
  • 装饰着模式:
    • BeanWrapper
  • 代理模式:
    • AOP
  • 观察者模式:
    • 事件监听器
  • 策略模式:
    • InstantiationStrategy – 根据不同情况进行实例化
  • 模版模式:
    • JdbcTemplate
  • 委派模式:
    • BeanDefinitionParserDelegate
  • 责任链模式
    • BeanPostProcessor

69.SpringBoot、SpringMVC和Spring有什么区别

spring时一个IOC容器,用来管理Bean,使用依赖注入实现控制反转,可以很方便的整合各种狂减,提供AOP机制解决了OOP的代码重复问题、更方便讲不同类不同方法中的共同处理抽取成切面、自动注入给方法执行,比如日志、异常等

SpringMVC时spring对web框架的一个解决方案,提供了一个总的前端控制器Servlet,用来接收请求,然后定义一套路由策略(url到handler的映射)及适配执行handler,讲handler结果使用视图解析技术生成视图展示给前端

SpringBoot时spring提供的一个快速开发工具包,让程序员更方便,更快速的开发spring+springmvc应用,简单了配置(约定了默认配置),整合了一系列的解决方案(starter机制)、redis、mongodb,es,可以开箱即用

70.SpringMVC工作流程

  1. 用户发送请求到前端控制器DispatcherServlet。
  2. DispatchServlet收到请求调用HanderMapping处理器映射器。
  3. 处理器映射器找到具体到处理器(可以根据xml配置、注解进行查找),生成处理器及处理器拦截器(如果有则生成)一并返回给dispatcherServlet。
  4. DispatcherServlet调用HandlerAdapter处理器适配器。
  5. HanderAdapter经过适配调用具体的处理器(Controller,也叫后端控制器)。
  6. Controller执行完成返回ModelAndView。
  7. HandlerAdapter讲controller执行结果modelAndView返回给DispatcherServlet。
  8. DispatcherServlet讲modelAndView传给ViewReslover视图解析器。
  9. ViewReslover解析后返回具体View。
  10. DispatcherServlet根据view进行渲染视图(即将模型数据填充到视图中)。
  11. DispatcherServlet相应用户。

71.SpringMVC的主要组件

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

HandlerMapping
initHandlerMappings(context),处理器映射器,根据用户请求的资源uri来查找Handler的。在SpringMVC中会有很多请求,每个请求都需要一个Handler处理,具体接收到一个请求之后使用哪个handler进行,这就是HandlerMapping需要做的事。

HandlerAdapter
initHandlerAdapter(context),适配器,因为SpringMVC中的Handler可以是任意形式,只要能处理请求就ok,但是Servlet需要处理方法的结构却是固定的,都是以request和response为参数到方法。如何让固定的Servlet处理调用灵活的handler进行处理呢?这就是HandlerAdapter需要做的事情。Handler是用来干活的工具;HandlerMapping用于根据需要干的活找到对应工具;HandlerAdapter是使用工具干活的人。

HandlerExceptionResolver
initHandlerExceptionResolvers(context),其它组件都是用来干活的。在干活的过程中难免会出现问题,出现问题后怎么办?这就需要有一个专门的角色对异常情况进行处理,在SpringMVC中就是HandlerExceptionResolver。具体来说,此组件的作用是根据异常设置ModelAndView,之后再交给render方法进行渲染。

ViewResolver
initViewResolvers(Context),ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。View是用来渲染页面的,也就是将程序返回的参数填入到模版里,生成HTML文件。这里有两个问题:使用哪个模板?用什么技术(规则)填写如惨?这其实是ViewResolver主要做的工作,ViewResolver需要找到渲染所用的模板和所用的技术(也就是视图的类型)进行渲染,具体的渲染过程则交由不同的视图自己完成

RequestToViewNameTranslator
initRequestToViewNameTranslator(context),ViewResolver是根据View Name查找View,但有的Handler处理完并没有设置View也没有设置ViewName,这时候就需要从request获取ViewName了,如何从request中获取ViewName就是RequestToViewNameTranslator需要做的事情。
RequestToViewNameTranslator在SpringMVC容器里只可以配置一个,所以所有request到ViewName的转换都要在一个Translator里面实现。

LocaleResolver
initLocaleResolver(context),解析视图需要两个参数:一个是视图名,另一个是Locale。视图名是处理器返回的,Local是从哪里来的?这就是LocaleResolver要做的事情,LocaleResolver用于从request解析出Locale,Locale就是zh-cn之类,表示一个区域,有了这个就可以对不同区域的用户显示不同的结果。SpringMVC主要是有两个地方用到了Locale:一是ViewResolver视图解析的时候;二是用到国际化资源或者主题的时候。

ThemResolver
initThemResolver(context),用于解析主题。SpringMVC中一个主题对应一个properties文件,里面存放着跟当前主题相关的所有资源、图片、css样式等。SpringMVC的主题也支持国际化,同一个主题不同区域也可以显示不同的风格。SpringMVC中跟主题相关的类有ThemeResolver、ThemeSource和Theme。主题是通过一系列资源来具体体现的,要得到一个主题的资源,首先要得到资源的名称,这是ThemeResovler的工作。然后通过主题名称来找到对应的主题(可以理解为一个配置)文件,这是ThemeSource的工作,最后从主题中获取资源就可以了。

MultiparResolver
initMultipartResolver(context),用于处理上传请求。处理方法是将普通的request包装成MultiparHttpServletReqeust,后者可以直接调用getFile方法获取File,如果上传多个文件,还可以调用getFileMap得到FileName-》File结构的Map。此组件中一共有三个方法,作用分别是判断是不是上传的请求,将request包装成MultiparHttpServletRequest、处理完后清理上传过程中产生的临时资源。

FlashMapManager
initFlashMapManager(context),用来管理FlashMap的,FlashMap主要用在redirect中传递参数。

72.SpringBoot自动装配原理

@Import + @Configuration + Spring spi
自动配置陪由各个starter提供,使用@Configuration + @Bean定义配置类,放到META-INF/spring.factories下

使用Spring spi扫描META-INF/spring.factories下的配置类

使用@Import导入自动装配类

73.如果理解SpringBoot中的Starter

使用Spring + SpringMVC使用,如果需要引入mybatis等框架,需要xml中定义mybatis需要的bean

starter就是定义一个stater的jar包,写一个@Configuration配置类、将这些bean定义在里面,然后在stater包在META-INF/spring.facories中写入该配置类,springboot会按照约定来加载配置类,开发人员只需要将相应的stater包依赖应用,进行相应的属性配置(使用默认配置时,不需要配置),就可以直接进行代码开发,使用对应的功能了,比如mybatis-spring-boot-start,spring-boot-starter-redis

74.什么是嵌入式服务器?为什么使用嵌入式服务器?

节省了下载安装tomcat,应用也不需要进行再打war包,然后放到webapp目录下运行

只需要安装一个java虚拟机,就可以直接在上面部署应用了

springBoot以及内置了tomcat.jar,运行main方法时会去启动tomcat,并利用tomcat的spi机制家长springmvc

75.SpringBoot中常用注解及其底层实现

  1. @SpringBootApplication注解:这个注解标识了一个SpringBoot工程,它实际上是另外三个注解的组合,这三个注解是:
    • @SpringBootConfiguration:这个注解实际就是一个@Configuration,表示启动类也是一个配置类
    • @EnableAutoConfiguration:向Spring容器中导入了一个selector,用来夹在ClassPath下SpringFactories中所定义的自动配置类,将这些自动加载为配置Bean
    • @CoomponetScan:标识扫描路径,因为默认是没有配置实际扫描路径,所以SpringBoot扫描的路径是启动类所在的当前目录
  2. @Bean注解:用来定义Bean,类似于Xml中的标签,在Spring启动时,会对加了@Bean注解的方法进行解析,将方法的名字作为beanName,并通过执行方法得到bean对象。

76.SpringBoot是如何启动Tomcat的

  1. 首先,SpringBoot在启动时会先创建一个tomcat容器
  2. 在创建spring的容器过程中,会利用@ConditionOnClass技术来判断当前classpath中是否存在tomcat依赖,如果存在会生成一个tomcat的baen
  3. spring容器创建后,就会获取启动tomcat的bean,并创建tomcat对象,并绑定端口等,然后启动了tomcat

77.SpringBoot配置文件等加载顺序时怎么样的

优先级从高到低,高优先级的配置覆盖低优先级的配置,所有配置会形成互补配置。

  1. 命令行参数,所有配置的都可以在命令行上指定
  2. Java系统属性(System.getProperties())
  3. 操作系统变量
  4. jar包外部的application-{profile}.properties或application.yaml(带spring.profile)配置文件
  5. jar包外部的application-{profile}.properties或application.yaml(带spring.profile)配置文件再加载不带profile
  6. jar包外部的application.properties或application.yaml(不带spring.profile)配置文件
  7. jar包内部的appilcation.properties或application.yam(不带spring.profile)配置文件
  8. @Configuration注解类上@PropertySource

78.Mybatis的优缺点

优点:

  • 给予SQL语言编程,相当灵活,不会对应用程序或者数据库现有设计造成任何影响,SQL卸载xml中,解除了SQL与代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用
  • 与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
  • 很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis同样支持)。
  • 能够与Spring很好的集成
  • 提供映射表情,支持对象与数据库的ORM字段关系映射;提供对象关系映射表情,支持对象关系组件维护。
    缺点:
  • SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
  • SQL语句依赖与数据库,导致数据移植性差,不能随意更换数据库。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值