Java面试题p6
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有更好的二级缓存,且可更换为第三方缓存
- 本文标签: Java
- 本文链接: http://119.91.109.247:8443//article/56
- 版权声明: 本文由张亚东原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权