2020年java面试宝典

目录


大家好:第一次写博客:本人外号"铁子",今天把自己两年以来收集的java面试宝典发出来,大家一起共同学习,交流。本人目前在上海工作。欢迎大家多多交流!话不多说:上干货!

—框架有关

1.Spring的理解

Spring的理解
  是一个轻量级控制反转(IOC)和面向切面(AOP)的容器框架
目的:解决企业应用开发的复杂性
功能:使用基本的javabean代替EJB并提供了更多的企业应用功能

2.什么是EJB

什么是EJB?(EnterPrise JavaBean)
  EJB是Sun公司的javaEE服务器端组件模型,设计目标与核心应用是部署分布式应用程序
范围:所有的Java应用
轻量:大小和开销Spring都是轻量的

3.IOC AOP

控制反转(IOC):
  Spring通过控制反转促进了松耦合,使用了IOC一个对象以外的其他对象会通过被动的方式传递进来,而不是这个对象直接创建,或者查找依赖对象
面向切面(AOP):
  Spring提供了面向切面编程的丰富支持,允许通过分离应用的业务逻辑与系统级服务和事物管理进行内聚性的开发(使用了动态代理模式)
容器:Spring包含并管理应用对象的配置和生命周期,在这个意义上是一个容器
框架:Spring可以将简单的组件配置组成复杂的应用

4.Spring三大核心组件

Core(核心)
  核心容器提供Spring框架的基本功能Spring以bean的方式组织和管理Java应用中的各个组件及其关系Spring使用BeanFactory来产生和管理Bean,它是工厂模式的实现BeanFactory使用控制反转(IOC)模式将应用的配置和依赖性规范与实际的应用程序代码分开BeanFactory使用依赖注入的方式提供给组件依赖
Context(上下文对象)
  上下文是一个配置文件,向Spring框架提供上下文信息
Bean(实体类)
  Bean组件在Spring中的Beans包下,为了解决三件事Bean的创建,Bean的定义,Bean的解析最关心的就是Bean的创建

5.重要的Spring注解

@Controller ------- 用于 Spring MVC 项目中的控制器类
@Service -------用于服务类
@RequestMapping ------- 用于在控制器处理程序方法中配置 URI 映射
@ResponseBody -------用于发送 Object 作为响应,通常用于发送 XML 或 JSON 数据作为响应
@PathVariable -------用于将动态值从 URI 映射到处理程序方法参数
@AutoWired ------- 用于在 spring bean 中自动装配依赖项

6.SpringMVC工作原理

  浏览器发送请求dispatcherServlet(核心控制器)接收到请求后将请求交给HandlerMapping(映射器)映射器根据地址对应的控制器,如果是静态资源则直接跳转到静态资源,返回给核心控制器,如果没有找到则直接返回null(404)核心控制器接收到映射器返回的内容后将请求控制权交给HandlerAdaper(适配器)适配器根据请求执行方法返回modelAndview(模型和视图)给核心控制器,根据视图地址找到视图解析器,找到相对应视图对象将模型数据交给视图对象进行视图渲染

7.简述MVC

(Model View Controller)
Model:处理业务逻辑的模块 每一种处理一个模块
View:负责页面显示,显示model处理的结果给用户,实现数据到页面的转换过程
Controller:负责请求分发,把form数据传递给model处理,把结果传递给view显示

8.什么是Mybatis

Mybatis的前身是ibatis

  1. Mybatis是一个ORM框架(持久层框架)
  2. Mybatis提供了三种映射:表和类,属性和字段,组件和方法
  3. 专注于sql语句,对象映射和输入输出,都由框架帮你完成,所以属于半ORM系统

9.什么是ORM

(Object Relation Mapping)对象关系映射

  1. 它的作用是在关系型数据库和对象之间作一个映射,内部封装了jdbc,我们在具体的操作数据库的时候,就不需要再去和复杂的SQL语句打交道
  2. 编写程序的时候,以面向对象的方式处理数据 保存数据的时候,却以关系型数据库的方式存储
  3. ORM是通过使用描述对象和数据库之间映射的元数据,将JAVA程序中的对象自动持久化到关系数据库中
请写出数据库的crud代码
1.insert into 表名 values(‘数据’,…);
2.select * from 表名where 条件
3.update 表名 set 列名="新值" WHERE 条件
4.delete from 表名 where 条件

10.Mybatis的优点

(mybatis与JDBC的区别)
(1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理,提供XML标签,支持编写动态SQL语句,并可重用
(2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接
(3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)
(4)能够与Spring很好的集成
(5)提供映射标签,支持对象与数据库的ORM字段关系映射,提供对象关系映射标签,支持对象关系组件维护

MyBatis框架的缺点
(1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求
(2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库

Mybaits的运行原理

  1. 返回创建SqlSessionFactory对象
  2. 返回SqlSession的实现类DefaultSqlSession对象
  3. 返回一个MapperProxy的代理对象
  4. 执行查询流程

Mybatis的动态SQL

  1. 编写sql

  2. 配置对象属性与结果集中列名的对应关系1

  3. 拼接sql

  4. 格式化输出

  5. insert—update—delete-select

  6. ResultMap是什么

    1. 建立sql查询结果与实体属性的映射关系信息
    2. 查询结果集转换成java对象,方便进一步操作
    3. 将结果集的列与java对象中的属性对应起来并将值填充进去
  7. if标签—foreach标签—choose标签(switch)

  8. where标签—set标签

11.Mybatis缓存机制

缓存:瞬间的存储->内存条->文件当中(缓存服务器中redis mongodb)->解决数据库(关系型数据库)压力
1)事务级别
在同一事务中数据进行了缓存,当出现一致的则不会进行数据库访问mybatis默认就有一级缓存(事务级别),不能去除事务(同一会话(session))
2)应用级别
数据缓存是针对整个应用程序,mybatis称为二级缓存,必须实体类需要序列化
3)集群级别

一级缓存
  作用域是SqlSession范围的,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存)
第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率

二级缓存
  是mapper级别的缓存使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存是跨SqlSession的

12.Hibernate有那五个核心接口

Configuration接口
  配置Hibernate,根据其启动Hibernate,创建SessionFactory对象
SessionFactory接口
  初始化Hibernate,充当数据存储源的代理,创建Session对象,SessionFactory是线程安全的,意味着同一个实例可以被应用的多个线程共享,是重量级,二级缓存
Session接口
  负责保存,更新,删除,加载和查询对象,是线程不安全的,避免多个线程共享同一个session,是轻量级,一级缓存
Transaction接口
  管理事物
query接口Criteria接口
  执行数据库查询

13.Hibernate和Mybatis有什么区别

  1. Hibernate是全自动,而Mybatis是半自动
      hibernate完全可以通过对象关系模型实现对数据库的操作,拥有完整的JavaBean对象与数据库的映射结构来自动生成sql
      而Mybatis仅有基本的字段映射,对象数据以及对象实际关系仍然需要通过手写sql来实现和管理
  2. Hibernate数据库移植性远大于Mybatis
      hibernate通过它强大的映射结构和hql语言,大大降低了对象与数据库(oracle、mysql等)的耦合性,而mybatis由于需要手写sql,因此与数据库的耦合性直接取决于程序员写sql的方法,如果sql不具通用性而用了很多某数据库特性的sql语句的话,移植性也会随之降低很多,成本很高
  3. Hibernate拥有完整的日志系统,Mybatis则欠缺一些
      hibernate日志系统非常健全,涉及广泛,包括:sql记录、关系异常、优化警告、缓存提示、脏数据警告等;
      而mybatis则除了基本记录功能外,功能薄弱很多
  4. mybatis相比hibernate需要关心很多细节
      hibernate配置要比mybatis复杂的多,学习成本也比mybatis高但也正因为mybatis使用简单,才导致它要比hibernate关心很多技术细节mybatis由于不用考虑很多细节,开发模式上与传统jdbc区别很小,因此很容易上手并开发项目,但忽略细节会导致项目前期bug较多,因而开发出相对稳定的软件很慢,而开发出软件却很快hibernate则正好与之相反但是如果使用hibernate很熟练的话,实际上开发效率丝毫不差于甚至超越mybatis
  5. sql直接优化上,mybatis要比hibernate方便很多
      由于mybatis的sql都是写在xml里,因此优化sql比hibernate方便很多而hibernate的sql很多都是自动生成的,无法直接维护sql;虽有hql,但功能还是不及sql强大,见到报表等变态需求时,hql也歇菜,也就是说hql是有局限的;hibernate虽然也支持原生sql,但开发模式上却与orm不同,需要转换思维,因此使用上不是非常方便总之写sql的灵活度上hibernate不及mybatis

14.Spring Boot

  是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置,以最小的代价进行开发项目

15.SpringBoot的优点

  ·独立运行·简化配置·自动配置·无代码生成和XML配置·应用监控·上手快

16.SpringBoot的元注解

1.@SpringBootApplication:包含了@ComponentScan、@Configuration和@EnableAutoConfiguration注解。其中@ComponentScan让spring Boot扫描到Configuration类并把它加入到程序上下文。
2.@Configuration 等同于spring的XML配置文件;使用Java代码可以检查类型安全。
3.@EnableAutoConfiguration 自动配置。
4.@ComponentScan 组件扫描,可自动发现和装配一些Bean。
5.@Component配合CommandLineRunner使用,在程序启动后执行一些基础任务。
6.@RestController注解是@Controller和@ResponseBody的合集,表示这是个控制器bean,并将函数的返回值直接填入HTTP响应体中,是REST风格的控制器。
7.@Autowired自动导入。
8.@PathVariable获取参数。
9.@JsonBackReference解决嵌套外链问题。
10.@RepositoryRestResourcepublic配合spring-boot-starter-data-rest使用。

17.SpringCould

  事实上是一整套基于Spring Boot的微服务解决方案,它为开发者提供了很多工具,用于快速构建分布式系统的通用模式,例如:配置管理,注册中心,服务发现,负载均衡,网关

1.Eureka注册中心
各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从而知道其他服务在哪里
Eureka Client:负责将这个服务的信息注册到Eureka Server中
Eureka Server:注册中心,里面有一个注册表,保存了各个服务所在的机器和端口号

2.Feign申明式服务调用
在接口上定义@FeignClient注解,Feign就会创建一个动态代理,你需要调用那个接口,Feign就会动态构造出你需要请求的服务的地址,针对这个地址发起请求,解析响应
基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求

3.Ribbon负载均衡
服务间发起请求的时候,基于Ribbon做负载均衡,从一个服务的多台机器中选择一台,默认使用的是轮询算法

4.Hystrix熔断器
一发起请求是通过Hystrix的线程池来走的,不同的服务走不同的线程池,实现了不同服务调用的隔离,避免了服务雪崩的问题

5.Zuul网关:如果前端、移动端要调用后端系统,统一从Zuul网关进入,由Zuul网关转发请求给对应的服务

18.过滤器(Filter)和拦截器(Interceptor)

  1. 过滤器基于函数回调,拦截器基于反射
  2. 过滤器依赖于servlet容器,拦截器依赖于web框架
  3. 过滤器对所有请求都起作用,拦截器只对action请求起作用
  4. 过滤器只能在容器初始化被调用一次,在action生命周期可以随意调用
  5. 过滤器是拦截用户请求的,范围比拦截器大的多

19.Redis(Remote Dictionary Server)

  远程数据服务,由意大利Salvatore Sanfilippo使用ANSI C语音开发的一款内存高速缓存数据库,是一个典型的NOSQL数据库服务,是一个Key-value存储系统,支持丰富的数据类型

20.Redis的特点(默认端口6379)

  1. 支持数据持久化:
    将内存中的数据保存在磁盘中&
  • 3
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值