第六篇 MyBatis + SpringMVC + Spring + SpringBoot 常见面试题

目录

springMVC:

1、简单的0谈一下SpringMVC的工作流程?

2、说出Spring或者SpringMVC中常用的5个注解,并解释含义

3.@AutoWired 和@Resource 的区别?

4、简述SpringMVC中如何返回JSON数据(北京)

spring:

1、谈谈你对Spring的理解

2、Spring中常用的设计模式

3、Spring循环依赖问题

三级缓存

需要22个断点(可选)debug源代码过程

4、介绍一下Spring bean 的生命周期、注入方式和作用域

5、请描述一下Spring 的事务管理

MyBatis

1、MyBatis中 #{}和${}的区别是什么?

2、Mybatis 中一级缓存与二级缓存?(北京)

3、MyBatis如何获取自动生成的(主)键值?(北京)

4、简述Mybatis的动态SQL,列出常用的6个标签及作用(北京)

5、Mybatis 如何完成MySQL的批量操作,举例说明(北京)

SpringBoot

1、谈谈怎么理解SpringBoot框架?

2、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

3、Spring Boot 自动配置原理是什么?

4、SpringBoot配置文件有哪些?怎么实现多环境配置?

SpringCloud

1、SpringBoot和SpringCloud是什么关系(北京)

2、SpringCloud都用过哪些组件?介绍一下作用

3、Nacos作用以及注册中心的原理(北京)

4、Feign工作原理(北京)


springMVC:

1、简单的0谈一下SpringMVC的工作流程?

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

2、说出Spring或者SpringMVC中常用的5个注解,并解释含义

@Component  基本注解,标识一个受Spring管理的组件

@Controller    标识为一个表示层的组件

@Service       标识为一个业务层的组件

@Repository    标识为一个持久层的组件

@Autowired     自动装配

@Qualifier(“”)    具体指定要装配的组件的id值

@RequestMapping()  完成请求映射

@PathVariable    映射请求URL中占位符到请求处理方法的形参

3.@AutoWired 和@Resource 的区别?

@AutoWired@Resource
属于spring属于Java
先ByType,在ByName先ByName,在ByType
常和@Qualifier配合使用

ByType:对象中属性类型与容器中class数值匹配。

ByName:对象中属性名称与容器中id数值匹配

4、简述SpringMVC中如何返回JSON数据(北京)

Step1:在项目中加入json转换的依赖,例如jackson,fastjson,gson等

Step2:在请求处理方法中将返回值改为具体返回的数据的类型, 例如数据的集合类List<Employee>等

Step3:在请求处理方法上使用@ResponseBody注解

spring:

1、谈谈你对Spring的理解

Spring 是一个开源框架。Spring 是一个 IOC 和 AOP 容器框架。

Spring 容器的主要核心是:

控制反转(IOC),传统的 java 开发模式中,当需要一个对象时,我们会自己使用 new 或者 getInstance 等直接或者间接调用构造方法创建一个对象。而在 spring 开发模式中,spring 容器使用了工厂模式为我们创建了所需要的对象,不需要我们自己创建了,直接调用spring 提供的对象就可以了,这是控制反转的思想

依赖注入(DI),spring 使用 javaBean 对象的 set 方法或者带参数的构造方法为我们在创建所需对象时将其属性自动设置所需要的值的过程,就是依赖注入的思想。(偏实现)

面向切面编程(AOP),在面向对象编程(oop)思想中,我们将事物纵向抽成一个个的对象,例如封装,继承,多态。而在面向切面编程中,我们将一个个的对象某些类似的方面横向抽成一个切面,横向提取,动态织入。可以利切脉你做一些功能的扩展,例如日志,事务。AOP 底层是动态代理,如果是接口采用 JDK 动态代理,如果是类采用CGLIB 方式实现动态代理。

2、Spring中常用的设计模式

(1)代理模式——spring 中两种代理方式,若目标对象实现了若干接口,spring 使用jdk 的java.lang.reflect.Proxy类代理。若目标兑现没有实现任何接口,spring 使用 CGLIB 库生成目标类的子类。

(2)单例模式——在 spring 的配置文件中设置 bean 默认为单例模式。

(3)模板方式模式——用来解决代码重复的问题。

比如:RestTemplate、JmsTemplate、JpaTemplate

(4)工厂模式——在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用同一个接口来指向新创建的对象。Spring 中使用 beanFactory 来创建对象的实例。

3、Spring循环依赖问题

三级缓存

对象名含义
一级缓存singletonObjects存放已经经历了完整生命周期的Bean对象
二级缓存earlySingletonObjects存放早期暴露出来的Bean对象,Bean的生命周期未结束(属性还未填充完)
三级缓存singletonFactories存放可以生成Bean的工厂 


需要22个断点(可选)debug源代码过程

1,A创建过程中需要B,于是A将自己放到三级缓里面,去实例化B

2,B实例化的时候发现需要A,于是B先查一级缓存,没有,再查二级缓存,还是没有,再查三级缓存,找到了A然后把三级缓存里面的这个A放到二级缓存里面,并删除三级缓存里面的A

3,B顺利初始化完毕,将自己放到一级缓存里面(此时B里面的A依然是创建中状态)

然后回来接着创建A,此时B已经创建结束,直接从一级缓存里面拿到B,然后完成创建,并将A自己放到一级缓存里面。

4、介绍一下Spring bean 的生命周期、注入方式和作用域

Bean的生命周期

(1)默认情况下,IOC容器中bean的生命周期分为五个阶段:

  1. 调用构造器 或者是通过工厂的方式创建Bean对象
  2. 给bean对象的属性注入值
  3. 调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.
  4. 使用
  5. IOC容器关闭时, 销毁Bean对象.

(2)当加入了Bean的后置处理器后,IOC容器中bean的生命周期分为七个阶段:

  1. 调用构造器 或者是通过工厂的方式创建Bean对象
  2. 给bean对象的属性注入值
  3. 执行Bean后置处理器中的 postProcessBeforeInitialization
  4. 调用初始化方法,进行初始化, 初始化方法是通过init-method来指定的.
  5. 执行Bean的后置处理器中 postProcessAfterInitialization   
  6. 使用
  7. IOC容器关闭时, 销毁Bean对象

注入方式:

通过 setter 方法注入

通过构造方法注入

Bean的作用域

总共有四种作用域:

  1. Singleton  单例的
  2. Prototype  原型的
  3. Request
  4. Session

5、请描述一下Spring 的事务管理

(1)声明式事务管理的定义:用在 Spring 配置文件中声明式的处理事务来代替代码式的处理事务。这样的好处是,事务管理不侵入开发的组件,具体来说,业务逻辑对象就不会意识到正在事务管理之中,事实上也应该如此,因为事务管理是属于系统层面的服务,而不是业务逻辑的一部分,如果想要改变事务管理策划的话,也只需要在定义文件中重新配置即可,这样维护起来极其方便。

基于 TransactionInterceptor  的声明式事务管理:两个次要的属性: transactionManager,用来指定一个事务治理器, 并将具体事务相关的操作请托给它; 其他一个是 Properties 类型的transactionAttributes 属性,该属性的每一个键值对中,键指定的是方法名,方法名可以行使通配符, 而值就是表现呼应方法的所运用的事务属性。

(2)基于 @Transactional 的声明式事务管理:Spring 2.x 还引入了基于 Annotation 的体式格式,具体次要触及@Transactional 标注。@Transactional 可以浸染于接口、接口方法、类和类方法上。算作用于类上时,该类的一切public 方法将都具有该类型的事务属性。

(3)编程式事物管理的定义:在代码中显式挪用 beginTransaction()、commit()、rollback()等事务治理相关的方法, 这就是编程式事务管理。Spring 对事物的编程式管理有基于底层 API 的编程式管理和基于 TransactionTemplate 的编程式事务管理两种方式。

MyBatis

1、MyBatis中 #{}和${}的区别是什么?

#{}是预编译处理,${}是字符串替换;

Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement(预处理声明对象)的set方法来赋值;

Mybatis在处理${}时,就是把${}替换成变量的值;

使用#{}可以有效的防止SQL注入,提高系统安全性。

2、Mybatis 中一级缓存与二级缓存?(北京)

(1)MyBatis的缓存分为一级缓存和 二级缓存。

一级缓存是SqlSession级别的缓存,默认开启。

二级缓存是NameSpace级别(Mapper)的缓存,多个SqlSession可以共享,使用时需要进行配置开启。

(2)缓存的查找顺序:二级缓存 => 一级缓存 => 数据库

3、MyBatis如何获取自动生成的(主)键值?(北京)

在<insert>标签中使用 useGeneratedKeys   和  keyProperty 两个属性来获取自动生成的主键值。

示例:

<insert id=”insertname” usegeneratedkeys=”true” keyproperty=”id”>  
    insert into names (name) values (#{name})  
</insert> 

4、简述Mybatis的动态SQL,列出常用的6个标签及作用(北京)

动态SQL是MyBatis的强大特性之一 基于功能强大的OGNL表达式。

动态SQL主要是来解决查询条件不确定的情况,在程序运行期间,根据提交的条件动态的完成查询

常用的标签:

<if> : 进行条件的判断

<where>:在<if>判断后的SQL语句前面添加WHERE关键字,并处理SQL语句开始位置的AND 或者OR的问题

<trim>:可以在SQL语句前后进行添加指定字符 或者去掉指定字符.

<set>:  主要用于修改操作时出现的逗号问题

<choose> <when> <otherwise>:类似于java中的switch语句.在所有的条件中选择其一

<foreach>:迭代操作

5、Mybatis 如何完成MySQL的批量操作,举例说明(北京)

MyBatis完成MySQL的批量操作主要是通过<foreache>标签来拼装相应的SQL语句.

例如:

<insert id="insertBatch" >  
    insert into tbl_employee(last_name,email,gender,d_id) values  
    <foreach collection="emps" item="curr_emp" separator=",">  
        (#{curr_emp.lastName},#{curr_emp.email},#{curr_emp.gender},#{curr_emp.dept.id})  
    </foreach>  
</insert>  

SpringBoot

1、谈谈怎么理解SpringBoot框架?

Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供了各种启动器,开发者能快速上手。

Spring Boot的优点

1.独立运行

Spring Boot而且内嵌了各种servlet容器,Tomcat、Jetty等,现在不再需要打成war包部署到容器中,Spring Boot只要打成一个可执行的jar包就能独立运行,所有的依赖包都在一个jar包内。

2.简化配置

spring-boot-starter-web启动器自动依赖其他组件,简少了maven的配置。除此之外,还提供了各种启动器,开发者能快速上手。

3.自动配置

Spring Boot能根据当前类路径下的类、jar包来自动配置bean,如添加一个spring-boot-starter-web启动器就能拥有web的功能,无需其他配置。

4.无代码生成和XML配置

Spring Boot配置过程中无代码生成,也无需XML配置文件就能完成所有配置工作,这一切都是借助于条件注解完成的,这也是Spring4.x的核心功能之一。

5.应用监控

Spring Boot提供一系列端点可以监控服务及应用,做健康检测。

Spring Boot缺点:

Spring Boot虽然上手很容易,但如果你不了解其核心技术及流程,所以一旦遇到问题就很棘手,而且现在的解决方案也不是很多,需要一个完善的过程。

2、Spring Boot 的核心注解是哪个?它主要由哪几个注解组成的?

3、Spring Boot 自动配置原理是什么?

注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,

首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。

@EnableAutoConfiguration是实现自动配置的注解

@Configuration表示这是一个配置文件

具体参考文档:

https://mp.weixin.qq.com/s?__biz=MzI3ODcxMzQzMw==&mid=2247484365&idx=1&sn=a4ab1d977d6b03bf122b4d596d7ee1ab&scene=21

4、SpringBoot配置文件有哪些?怎么实现多环境配置?

Spring Boot 的核心配置文件是 application 和 bootstrap 配置文件。

application 配置文件这个容易理解,主要用于 Spring Boot 项目的自动化配置。

bootstrap配置文件的特性:

  1. boostrap 由父 ApplicationContext 加载,比 applicaton 优先加载
  2. boostrap 里面的属性不能被覆盖

bootstrap 配置文件有以下几个应用场景:

  1. 使用 Spring Cloud Config 配置中心时,这时需要在 bootstrap 配置文件中添加连接到配置中心的配置属性来加载外部配置中心的配置信息;
  2. 一些固定的不能被覆盖的属性;
  3. 一些加密/解密的场景;

提供多套配置文件,如:

applcation.properties

application-dev.properties

application-test.properties

application-prod.properties

运行时指定具体的配置文件,具体请看这篇文章《Spring Boot Profile 不同环境配置》。

SpringCloud

1、SpringBoot和SpringCloud是什么关系(北京)

Spring Boot 是 Spring 的一套快速配置脚手架,可以基于Spring Boot 快速开发单个微服务,Spring Cloud是一个基于Spring Boot实现的开发工具;Spring Boot专注于快速、方便集成的单个微服务个体,Spring Cloud关注全局的服务治理框架; Spring Boot使用了默认大于配置的理念,很多集成方案已经帮你选择好了,能不配置就不配置,Spring Cloud很大的一部分是基于Spring Boot来实现,必须基于Spring Boot开发。

 可以单独使用Spring Boot开发项目,但是Spring Cloud离不开 Spring Boot。

2、SpringCloud都用过哪些组件?介绍一下作用

经常用的组件:

1. Nacos--作为注册中心和配置中心,实现服务注册发现和服务健康监测及配置信息统一管理

2. Gateway--作为网关,作为分布式系统统一的出入口,进行服务路由,统一鉴权等

3. OpenFeign--作为远程调用的客户端,实现服务之间的远程调用

4. Sentinel--实现系统的熔断限流

5. Sleuth--实现服务的链路追踪

3、Nacos作用以及注册中心的原理(北京)

服务注册原理

服务注册方法:以Java nacos client v1.0.1 为例子,服务注册的策略的是每5秒向nacos server发送一次心跳,心跳带上了服务名,服务ip,服务端口等信息。同时 nacos server也会向client 主动发起健康检查,支持tcp/http检查。如果15秒内无心跳且健康检查失败则认为实例不健康,如果30秒内健康检查失败则剔除实例。

4、Feign工作原理(北京)

主程序入口添加了@EnableFeignClients注解开启对FeignClient扫描加载处理。根据Feign Client的开发规范,定义接口并加@FeignClient注解。当程序启动时,进行包扫描,扫描所有@FeignClient的注解的类,并且讲这些信息注入Spring IOC容器中,当定义的的Feign接口中的方法调用时,通过JDK的代理方式,来生成具体的RequestTemplate.当生成代理时,Feign会为每个接口方法创建一个RequestTemplate。当生成代理时,Feign会为每个接口方法创建一个RequestTemplate对象,对象封装HTTP请求需要的全部信息,如请求参数名,请求方法等信息都是在这个过程中确定的。然后RequestTemplate生成Request,然后把Request交给Client去处理,这里指的时Client可以时JDK原生的URLConnection,ApacheHttpClient,也可以时OKhttp,最后Client被封装到LoadBalanceClient类,这个类结合Ribbon负载均衡发器服务之间的调用。

总结:

  1. feign相当于动态代理,代理的是Http客户端,发送的是客户端请求,直接请求的是服务器,不会走网关 
  2. 远程服务调用方式:
    1. RPC : Socket + 自定义序列化
    2. RestAPI : Http + Json
  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值