原创

Java面试题p6

温馨提示:
本文最后更新于 2025年06月30日,已超过 348 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

spring mvc 组件

前置控制器 DispatcherServlet

映射控制器 HandlerMapping

处理器 Controller

模型和视图 ModelAndView

视图解析器 ViewResolver

@RequestMapping作用

将http请求映射到相应的方法上

@Autowired作用

@Autowired 它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作,消除get\set方法

spring boot

spring boot是为spring服务的,用来简化新spring应用的初始化搭建以及开发过程的

为何用spring boot

  • 配置简单
  • 独立运行
  • 自动装配
  • 无代码生成和xml配置
  • 提供应用监控
  • 易上手
  • 提升开发效率

spring boot的核心配置文件

bootstrap(.yml或.properties):bootstrap 由父ApplicationContext加载的,比ApplicationContext优先加载,且bootstrap里面的属性不能被覆盖

application(.yml或.properties):用于spring boot的自动化配置

spring boot的配置文件类型

.properties 特点:

以键值对的形式呈现:如:spring.datasource.username=root

.yml特点:

YAML是JSON的超集,是一种专门用来书写配置文件的语言。可以代替application.properties

  • 在创建一个springBoot时,引入的spring-boot-starter-web依赖简介地引入了snakeyaml依赖,snakeyaml会实现对YAML配置的解析
  • YAML使用简单,缩进表示层级关系,并且大小写敏感

spring boot热部署方式

  • 使用devtools启动热部署,添加devtools库,在配置文件中把spring.devtools.restart.enable设置为true
  • 使用intellij Idea编辑器,勾上自动编译或手动重新编译

jpa和hibernate区别

jpa:Java Persistence API。是Java持久化接口规范

hibernate属于jpa的具体实现

spring cloud

一系列框架的有序集合。利用spring boot的开发便利性巧妙地简化了分布式系统基础设施的开发。如发现注册、配置中心、消息总线、负载均衡、断路器、数据监控等,都可以用spring boot的开发风格做到一键启动和部署

spring cloud断路器

在分布式架构中,断路器的作用类似。当某个服务单元发生故障(类似用电器发生短路)之后,通过断路器的故障监控(类似熔断保险丝),向调用方返回一个错误响应。而不是长时间等待。这样就不会使得线程因为调用故障服务被长时间占用不释放,避免故障在分布式系统中的蔓延

spring cloud核心组件

Euraka:服务注册发现

Feign:基于动态代理机制,根据注解和选择的机器,拼接请求url地址,发起请求

Ribbon:实现负载均衡,从一个服务的多台机器中选择一台

Hystrix:提供线程池,不同的服务走不同的线程池,实现不同服务调用的隔离,避免服务雪崩问题

Zuul:网关管理,由Zuul网关转发请求给对应的服务

ORM框架

对象关系映射。是把数据库中的关系数据映射成为程序中的对象。

优点:提高开发效率,降低开发成本、移植性更强、更简单与对象化

MyBatis中#{} 和${} 区别

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

使用#{}时,MyBatis会将SQL中的#{}替换成“?”,配合PrepareStatement的set方法赋值,可有效防止SQL注入,保证程序运行安全

MyBatis分页方式

逻辑分页:使用MyBatis自带的RowBoubds进行分页,它是一次性查询很多数据,然后再进行检索

物理分页:自己手写SQL分页或使用分页插件PageHelper,去数据库查询指定条数的分页数据

RowBounds查询原理

RowBounds表面是在“所有”数据中检索数据,其实并非是一次性查询所有数据。MyBatis是对jdbc的封装,在jdbc中有一个Fetch Size的配置,它规定每次从数据库中查询多少条数据。

假如要查询更多数据,它会在执行next()的时候,去查询更多数据。对于jdbc来说,调用next()时会自动完成查询工作。好处是 防止内存溢出。

MyBatis分页方式区别

逻辑分页:一次性查询很多数据,然后在结果中检索分页的数据。

缺点:消耗大量内存、有内存溢出风险、对数据库压力较大

物理分页:从数据库查询指定条数的数据。弥补逻辑分页缺点

延迟加载原理

MyBatis支持延迟加载,设置lazyLoadingEnable=true即可。

原理:

调用的时候触发加载,不是在初始化的时候就加载信息。

MyBatis的一级缓存和二级缓存

一级缓存:基于PrepetualCache的HashMap本地缓存,它的生命周期是和SQL session一致的。有多个SQL session或者分布式环境中操作数据库,可能会出现脏数据。当Session flush或close之后,该Session 中的所有Cache将清空,默认开启

二级缓存:也是基于PrepetualCache的HashMap本地缓存。存储的作用域为Mapper级别的。若多个SQL session之间需要共享缓存,则需要使用到二级缓存,并且二级缓存可自定义存储源。如:Ehcache。默认不打开二级缓存。要开启二级缓存,使用二级缓存属性类需要实现Serializable序列化接口(可用来保存对象的状态)

开启二级缓存数据查询流程:二级缓存->一级缓存->数据库

缓存更新机制:当某一个作用域(一级缓存Session/二级缓存Mapper)进行了/C/U/D后,默认该作用域下所有select中的缓存将被clear

MyBatis和hibernate的区别

灵活性:MyBatis更加灵活。自己可以写SQL

可移植性:MyBatis许多自己写的SQL,因每个数据库的SQL可以不同,故移植性较差

学习和使用门槛:MyBatis入门简单,使用门槛更低

二级缓存:hibernate有更好的二级缓存,且可更换为第三方缓存










正文到此结束