FAQ集合(java后端面试常问)

Spring

1)为什么要将对象交给Spring管理?
我们程序中对象的运行有一个目标?第一:要解决业务问题,第二,要高效低耗的优化业务的执行.
那如何才能达成这样的目标?第一:充分分析业务,确定其对象,第二,要思考解决业务的这些对象
的运行性能.在Spring框架中不会帮我们解决业务问题,但可以从对象运行时的性能方面给予一定
的设计,例如Spring为我们的对象赋予了很多个更加科学的特性,例如延迟加载,作用域,生命周期方法以及运行时的自动依赖注入(降低耦合,提高程序的可维护性).

2)Spring框架中通过什么方式创建Bean对象?借助反射
a)获取类的字节码对象(Class类型-->类加载到内存时就可以获取)
b)获取类中的构造方法对象(Constructor类型)
c)基于(Constructor类型的对象创建对应类的实例(底层调用newInstance方法)

 

3).Spring框架是什么。

轻量级框架,资源整合的框架

这里资源是指什么?(在内存中运行的所有资源都可以理解对象)

这些资源对象有一些是我们自己定义(结合业务自己写的一些类),还有一些事第三资源(通用的框架或库)

 

三方资源整合-数据库连接池

1).借助Spring进行资源整合的目的是什么

简化Spring框架资源整合的过程,为Spring框架的资源整合提供基础依赖,基础配置,基础监控等,
实现了软件开发过程中的开箱即用特性.

 

2)如何理解数据库连接池?

1)何为连接池?(内存中一块存储"可重用连接对象"的空间)
2)为什么使用连接池?(提高其性能-反复创建和销毁连接会带来很大的性能损耗)
3)为什么说创建连接和销毁连接会有很大性能损耗?(底层建立连接使用的是TCP/IP协议,
基于此协议创建连接需要三次握手,释放连接需要四次挥手)

 2.1)你了解Java编程领域中的连接池吗?知道哪些产品?

1)C3P0
2)Druid (最强悍的是它提供的监控功能)
3)HikariCP (最强悍的是它的性能)

 

3)在C/S架构,如何提高服务端响应数据的速度(降低响应时间)?

回答此问题时,我们应该去思考,影响其响应性能(响应时间)的因素有哪些?
1)请求数据的传输时间?(数据量-压缩,带宽)
2)请求数据的处理时间?(架构,算法,CPU,磁盘,内存)
3)响应数据的传输时间?(数据量-压缩,带宽,缓存)
4)响应数据的渲染时间? (html,css,js,images)

问题思考:

你在学习Java中中还接触过哪些池?字符串池,整数池,线程池...

在学习和应用这些池时最重要的一种池化思想主要用于优化资源的使用,让资源可以重用。

 

4).假如让你设计一个连接池你会考虑哪些问题?

1)池的存储结构?(数组,链表)
2)从池中借,还连接的算法?
3)池操作的线程安全?(如何在保证线程安全的情况还要有很好的性能。)

例如:HikariCP底层存储连接使用的是数组结构,借和还都是随机,线程安全应用到CAS算法。

如何保证线程安全? 

导致线程不安全的因素有?

1.多线程并发。2.多线程有共享数据集。

3.多线程在共享数据集上的有读写操作并且不是原子操作。

(原子操作:一个线程没有完成当前操作是,有其他介入)

如何解决线程安全?

1.取消并发。2.取消数据共享。如不能多线程同时共享一个Connection对象。

3.保证多线程在共享数据集上的有操作是原子操作。如加锁

注意问题的思考

 

4.1)连接池设计时,会用到什么设计模式?

几乎所有的池的设计都会用到享元模---这个模式的设计目标就是减少对象的创建次数,

让对象可以被重用。

 

4.2)配置连接池时一般最大连接数会如何配置?

2.*cpu核数+1(磁盘数)

支持的并发连接数越多越好吗?(不一定,cpu个数比较少的话,cpu在线程之间来回切换)

基于I/O技术读写磁盘时,需要CPU吗?(不需要)

 

5)Java中连接池的规范是什么?为什么要有规范?

1)规范的定义:javax.sql.DataSource
2)使用规范可以让代码更严谨,其可维护性也会更好。

Java编程领域中所有连接池提供方,必须实现DataSource接口,后续我们编程时,可以通过
此接口获取具体连接池对象。

 

6).Java中具体是哪个对象负责建立与数据库的链接?Driver

7).SpringBoot工程中想使用HikariCP连接池应该如何实现?
第一步:添加依赖(mysql,spring-data-jdbc)
第二步:配置链接数据库的url,username,password,........
第三步:在程序中耦合DataSource接口获取具体数据源对象,。。。

 

8).执行数据访问的过程出现了异常,怎么处理?

1.记录日志(如将日志写到日志文件)

2.抛出异常(最后可以用一种友好的形式告诉用户出现什么问题)

记录日志用什么API? ( SLF4J--Simple Facade For java)

为什么用这组API(这组API定义了日志记录的规范,我们编程是建议耦合与规范)

这组API的设计中使用到什么设计模式?(门面模式)

 

SpringBoot工程中的Mybatis

1)@Mapper注解的作用是什么?

(mybatis框架定义,用于描述数据逻辑层接口,mybatis框架底层会基于字节码技术为其创建实现类对象,并交给spring管理)

 

2)@Mapper描述的接口的实现类,底层会做什么?
借助SqlSession对象,基于业务(查询,删除,。。。)实现与数据库的会话。

 

3) 你了解SqlSessionTemplate对象吗?

此对象是一个线程安全的SqlSession对象。这个对象在springboot工程中整合mybatis
框架实现数据访问访问操作时,是会话业务展开的一个入口对象。

 

4)对于mybatis中的映射(mapper)文件,在被读到内存以后,mybatis框架会做点什么?

第一:XML解析(读映射文件中的数据)
第二:封装读取到的数据?(例如一个映射元素一个MappedStatement对象)
第三:多个MappedStatement对象还会存储到map中(key为:namespace+id)

 

1.MyBatis 是什么?

Java生态中的数据持久层框架,底层基于JDBC技术封装数据访问逻辑,实现了更加灵活SQL定制,
更加简单的参数映射,结果集的映射,简化了我们数据层的编程过程。

你最喜欢mybatis框架的哪个特性?动态SQL

 

2.MyBatis 的应用过程是怎样?(应用架构)

在我们的程序中使用mybatis时会首先要拿到一个SqlSession接口类型的会话对象,基于此
对象中的方法找到SQL语句,然后底层借助JDBC技术发送SQL到数据库端,并处理SQL的执
行结果。


3.SpringBoot 工程中mybatis应用的构建过程是怎样的?
1)创建项目module?
2)添加项目依赖?(mysql,spring-data-jdbc,mybatis-starter)
3)配置mybatis初始化环境?(application.propeties)
4)编写业务代码并进行测试?
4.1)定义数据逻辑层接口及方法
4.2)定义SQL映射
4.3)定义单元测试类及方法进行单元测试
4.4)对测试结果进行分析(debug)
4.5)对测试结果中的错误进行总结和整理

 

 

Spring mvc

1)static目录中的html页面可以直接访问?(但是不能直接从model取数据)
2)templates目录中的html页面不可以直接访问?(但是可以通过controller访问,并且可以添加额外thymeleaf表达式)

1)thymeleaf是什么?(模板引擎,可以将html作为模板,官网thymeleaf.org)
2)thymeleaf解决了什么问题? (可以对html元素进行功能扩展,通过表达式从model取数据,通过属性实现循环操作,。。。)

1)@Controller作用是什么?

@Controller描述的对象为spring框架管理的bean,这个通常会作为spring web模块的一个请求处理器对象)

2)@Controller注解描述的类在spring mvc中是什么?(Handler)
3)我们自己写的Controller中的方法是如何被调用的?(通过@Autowired注解调用一般使用这个方法,也可以new调用)
4)我们Controller方法上使用@RequestMapping定义的内容是什么?什么时候会被提取内容?

(借助@RequestMapping定义请求url到方法的映射)

 

1. bean如何理解?
在spring工程中,由spring框架管理对象,spring给它起了个名,叫做Bean.

2. Pojo如何理解?

pojo是一个普通Java对象,这样的对象一般具备这样的特点:
1)提供封装数据的属性(变量)
2) 提供为属性赋值或获取值的set/get方法
3) 提供toString方法(可选)
4)提供无参构造函数(可选,但建议)

pojo对象一般包括: VO,BO,DO,DTO,..... (可去参考阿里规范)

3.DAO 如何理解?

DAO (Database Access Object)是一个数据访问对象,此对象一般位于数据逻辑层,这一层
的对象一般用于访问数据库,实现与数据库交互,这一层技术会用到jdbc,mybatis,...。


4.Spring MVC 分层和传统的三层架构如何理解?

传统三层架构一般指:
1)表示层
2)逻辑层 (控制逻辑,业务逻辑,数据逻辑)
3)数据层

Spring中的MVC是spring web模块基于MVC架构做一个落地实现,
这里的mvc主要用于处理WEB请求,可以理解为WEB请求处理层的
一个分层架构的实现。
1)View
2)Controller
3)Model

 

ModelAndView的创建方式?
a)将此类型以方法参数的形式在控制逻辑对象方法参数中进行定义
b)控制逻辑对象方法内部自己创建?new ModelAndView();

4)请求参数传递的方式有什么形式?

a)普通方式
b)Rest方式

控制逻辑层方法中的参数,你使用过什么注解进行描述?
a)@RequestParam(required=false)
b)@DateFormat(pattern="yyyy-MM-dd")
c)@PathVariable

 

2.MVC 是什么?
1)设计思想
2)分层架构设计思想
2.1)应该有负责呈现数据
2.2)应该有负责处理调度的
2.3)应该有负责执行具体逻辑的(请求响应处理逻辑,业务逻辑,数据逻辑)

 

3.MVC中的对象是如何划分的?

1)view (负责呈现数据)
2)Controller (负责请求响应调度-调度中心)
3)Model (处理各种逻辑)

目的:复杂问题简单化,提高代码的可维护性,可扩展性。

 

4.Spring Web模块中的MVC?

1)是MVC设计思想的一种实现(逻辑)
2)具体的落地实现是:
2.1)通过DispatcherServlet处理请求调度
2.2)通过Handler处理请求响应数据,
2.3)通过ViewResolver对View(html)进行解析

说明,在springboot工程整合spring mvc时,相对于传统的spring mvc工程的做了很多简化?

1)内嵌web服务器(默认为tomcat)
2)将DispatcherServlet,ViewResolver等对象的配置进行了默认实现。
3)运行时无须成war包,可以直接运行jar包工程。

 

5.SpringBoot 工程中Spring MVC应用的快速入门

第一步:创建module
第二步:添加依赖(spring-web,thymeleaf)
第三步:启动服务(tomcat,默认端口为8080)
第四步:修改端口配置(80)
第五步:分析项目结构(重点是templates,static目录)
第六步:基本业务实现(分别在static,templates目录下创建html页面,然后进行访问分析)

 

1.Spring MVC 中响应数据的处理?

1)响应数据的封装?(ModelAndView,Pojo,Map)
2)响应数据的呈现?(如何在html页面中获取model中的数据,thymeleaf中的定义的标签属性,表达式)
3)响应数据的转换? (将响应数据转换为JSON格式的字符串)

 

2.Spring MVC 中请求数据的处理?
1)请求url中数据的传递?
a)普通风格是的url方式,例如path?paramName1=paramValue1&paramName2=paramValue2
b)rest风格的url方式,例如path/{var1}/{var2}/{var3}

2)请求参数的获取?

a)在控制逻辑方法参数中基于直接量(String,8种封装类,Date)接收请求数据
b)在控制逻辑方法参数中基于POJO对象接收请求数据
c)在控制逻辑方法参数中基于Map对象接收请求数据

 

3.请求响应FAQ分析?

1)服务端响应到客户端的数据一般指是什么?
a)静态资源数据html/css/js/images
b)业务结果数据(普通格式,JSON格式)
b.1)正常数据(200)
b.2)异常数据(500)

2)在springboot web工程中响应数据是如何转换为json格式字符串的?

a)默认spring web会借助jackson框架将pojo或map转换为json格式
b)将pojo对象借助jackson框架转换为json格式字符串时,pojo对象一般需要提供get方法。
c)自己可以按照指定规则进行json转换。

3)在springboot工程中ModelAndView对象的作用是什么?
a)借助Model对象封装业务数据
b)借助View对象封装viewname。

 

springBoot中的bean

1.我们定义的Bean应该放在项目启动时被加载?

(必须在启动类所在包或子包中)

2.如何判定我们写的类,在项目启动时被加载了?

(借助了JVM参数进行分析:-XX:+TraceClassLoading)

3.spring工程中类被读到内存时是否会被直接创建其对象?

(@Scope("singleton") //设置bean对象的作用域,默认为singleton 单例

@Scope("prototype") //设置bean对象的作用域,多实例作用域,与@Lazy一起用时,不延迟创建)

4.对象被创建的一个标识是什么?

(构造方法执行了)

5.假如不希望对象在项目启动时创建,该如何配置?

(通过@Lazy注解描述对应的类)

6.SpringBoot工程什么样对象适合延迟加载配置?

(大对象、稀少用,也就是启动后可能马上用不到)

7.SpringBoot工程中的延迟加载如何理解?

(对象不用时,不创建其,节省内存)

8.SpringBoot工程假如希望对类的实例进行重用,我们该如何配置?

(设置Singleton作用域)

9.SpringBoot工程中Bean的作用域为Singleton时,此类的实例有什么特点?

(1.可以设置延迟加载特性。2.此Bean的实例可以存储到Bean池,让此对象可以重用。3.单例对象在使用时要注意器线程安全(单例对象共享时))

10.假如对象每次从spring容器获取都需要创建信息的实例,这个类型如何配置?

(设置Prototype作用域--多例,每次从spring框架请求类的实例都会创建新的)

11.Springboot工程中什么样的对象适合设置为prototype作用域?

(对象不需要重用,对象不是线程安全的)

12.SpringBoot工程中可以为Bean对象设置生命周期方法,但并不是每个对象都要设置

(什么样的对象一般会设置?)

一.bean的定义

1.Spring根据我们定义的注解@Component,找到相对类。2.找到了资源,就开始解析,并将信息保存起来,没有初始化bean。3.将bean的定义发布到springIoc的容器找中,此时Bean还没生成

二..bean的初始化

经过bean的定义,初始化,spring会继续完成bean的实例化和依赖的注入没这样Ioc容器中就可以得到一个依赖注入完成的bean。

三.bean的生存期

四.bean的销毁

13.为什么一些Spring Bean池中的一些对象要设置生命周期方法?

(辅助对象进行初始化和销毁)

 

Ajax

1.Ajax 是什么?
是客户端向服务端发送异步请求,按需取数据,然后进行局部更新的一种客户端技术。

最大优势:异步按需取数据,局部更新,可提高系统性能,改善用户体验。
最大劣势:不能直接跨域。

2.Ajax 应用场景?几乎所有的互联网web应用都会用到ajax技术

3.Ajax 应用请求响应模型分析?

1)传统方式的请求响应过程?(一个线程多个任务,服务端没有处理完,客户端会被阻塞)
2)ajax方式的请求响应过程?(多个线程并发执行多个任务,客户端无需等待服务端的响应结果)

4.Ajax 技术应用快速入门?

1)ajax编程的基本步骤?
2)ajax编程过程中的模板代码?((new,onreadystatechange,open,send))
3)ajax编程中具体业务实现?(get,post,put,delete)

5.Ajax 技术应用进阶实现?(封装共性-模板代码,提取特性-url,params,callback)

课后自学(需要一定的JS功底)

6.Jquery 中的ajax函数的应用

1)ajax(.....)(最重要)
2)post
3)get
4)load


框架中应用这些函数最重要的是什么?规则


1)Ajax技术应用的入口是什么?XmlHttpRequest对象
2)Ajax编程步骤中为什么要进行状态监听?因为我要处理服务端响应的数据
3)Ajax编程步骤中你了解readyState这个属性的几个状态值吗?(0,1,2,3,4)
4) Ajax编程过程中的js代码问题你是如何分析和解决的?(log,debugger,排除法)

 

posted @ 2020-11-30 19:50  Liang-shi  阅读(137)  评论(0编辑  收藏  举报