JAVA面试题大合集(600+道题目)

1.并行和并发有什么区别?

并行是指两个或多个事件在同一时刻发生,是在不同实体上的多个事件;

并发是指两个或多个事件在同一时间间隔发生,是在同一个实体上的多个事件

2.线程和进程的区别?

进程是资源分配最小单位,线程是程序执行最小单位

每个进程都有相应的线程

进程有独立的地址空间,线程没有

线程是指处理机调度的基本单位

进程执行开销大,线程执行开销小

3.守护线程是什么?

在java线程开发中,有两种线程:User Thread(用户线程);Daemon Thread(守护线程)

普通用户进程在JVM退出时依然会继续执行,导致JVM并不能退出

普通进程可以使用setDaemon(true)方法升级为守护进程,守护进程在JVM退出时会自动结束运行。

守护线程拥有自动结束自己生命周期的特性,而非守护线程不具备这个特点

4.创建线程有哪几种方式?

继承Thread类并实现run方法,调用继承类的start方法开启线程;

通过实现Runnable接口,重写run方法,调用线程对象的start方法开启线程;

除此之外,还可以通过实现Callable接口,实现call方法,并用FutureTask类包装Callable对象开启线程。

5.说一下 runnable 和 callable 有什么区别?

实现Callable接口的任务线程能返回执行结果,而实现Runnable接口的任务线程并不能返回执行结果

Callable接口的call方法允许抛出异常,而Runnable接口的run方法的异常只能在内部消化,不能继续上抛

篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记【点击此处即可】免费获取

6.线程有哪些状态?

新建、就绪、运行、阻塞、死亡

7.sleep() 和 wait() 有什么区别?

sleep后程序不会释放同步锁,wait后程序会释放同步锁

sleep可以指定睡眠时间,自动唤醒,wait可以直接用notify唤醒

sleep的类是Thread,wait的类是Object

8.notify()和 notifyAll()有什么区别?

notify()方法会唤醒对象等待池中的一个线程,进入锁池;

notifyAll()方法会唤醒等待池中的所有线程,进入锁池

9.线程的 run()和 start()有什么区别?

调用start()方法是用来启动线程的,轮到该线程执行时,会自动调用run方法;

直接运行run方法无法达到启动多线程的目的,相当于调用Thread对象中的run方法

一个线程的start方法只能调用一次,多次调用会抛出异常;而run方法可以多次调用

10.创建线程池有哪几种方式?

主要使用Excutors提供的通用线程池创建方法,去创建不同配置的线程池

newCachedThreadPool();特点:用来处理大量短时间工作任务的线程池

newFixedThreadPool(int nThreads);特点:重用指定数目(nThreads)的线程

newSingleThreadExecutor();特点:工作线程数目限制为1

newSingleThreadScheduledExecutor()和newScheduledThreadPool(int corePoolSize)可以进行周期或定时性的工作调度

newWorkStealingPool(int parallelism);特点:JDK8以后才加入

11.线程池都有哪些状态?

RUNNING:线程池被创建,可以接收新线程

SHUTDOWN:线程池被关闭,不接收新线程,但是可以处理已有的线程。通过调用shutdown()方法;

STOP:线程池停止,不接受新线程,中断当前的线程,并且不会处理已有的线程。通过调用shutdownnow()方法;

TIDYING:线程池等待,当线程池处于SHUTDOWN或者STOP状态,并且任务队列为空且执行中任务为空则会转变;

TERMINATED:线程池彻底终止,线程池在TIDYING状态中执行完terminated()方法后就会转变为此状态。

12.线程池中 submit()和 execute()方法有什么区别?

execute() 参数 Runnable ;submit() 参数 (Runnable) 或 (Runnable 和 结果 T) 或 (Callable)

execute() 没有返回值;而 submit() 有返回值

submit()的返回值Future调用get方法时,可以捕获处理异常

13.在 java 程序中怎么保证多线程的运行安全?

JDK Atomic开头的原子类、synchronized、LOCK,可以解决原子性问题

synchronized、volatile、LOCK,可以解决可见性问题

Happens-Before 规则可以解决有序性问题

14.多线程锁的升级原理是什么?

锁的级别:无锁 => 偏向锁 => 轻量级锁 => 重量级锁

无锁:没有对资源进行锁定,所有线程都可以访问,但是只有一个能修改成功,其他的线程会不断尝试,直至修改成功。

偏向锁:对象的代码一直被同一线程执行,不存在多个线程竞争,偏向锁,指的就是偏向第一个加锁线程,该线程不会主动释放偏向锁,只有当其他线程尝试竞争偏向锁时才会被释放。

偏向锁的撤销,需要在某个时间点上没有字节码正在执行时,先暂停拥有偏向锁的线程,然后判断锁对象是否处于被锁定状态。如果线程不处于活动状态,则将对象头设置成无锁状态,并撤销偏向锁;

如果线程处于活动状态,升级为轻量级锁的状态。

轻量级锁:轻量级锁是指当锁是偏向锁的时候,被第二个线程 B 所访问,此时偏向锁就会升级为轻量级锁,线程 B 会通过自旋的形式尝试获取锁,线程不会阻塞,从而提高性能。当前只有一个等待线程,则该线程将通过自旋进行等待。但是当自旋超过一定的次数时,轻量级锁便会升级为重量级锁;当一个线程已持有锁,另一个线程在自旋,而此时又有第三个线程来访时,轻量级锁也会升级为重量级锁。

重量级锁:指当有一个线程获取锁之后,其余所有等待获取该锁的线程都会处于阻塞状态。

15.什么是死锁?

死锁是指两个或两个以上的进程在竞争资源的过程中造成的不可解堵塞。两个线程都在互相等待。

16.怎么防止死锁?

预防:资源一次性分配;可剥夺资源;资源有序分配;超时放弃

避免:银行家算法;

检测:为每个进程和每个资源建立唯一的ID,建立资源分配表和进程等待表

解除:剥夺资源;撤销进程

17.ThreadLocal 是什么?有哪些使用场景?

ThreadLocal是线程本地存储,在每个线程中都创建了一个ThreadLocalMap对象,每个线程可以访问自己内部ThreadLocal对象内的value。

经典的使用场景是为每个线程分配一个JDBC连接的Connection,这样就可以保证每个线程都在各自的Connection上进行数据库的操作,不会出现A线程关了B线程的Connection,还有Session管理等问题。

18.说一下 synchronized 底层实现原理?

同步代码块是通过monitorenter和monitorexit指令获取线程的执行权;

同步方法是通过加ACC_SYNCHRONIZED 标识实现线程的执行权的控制

19.synchronized 和 volatile 的区别是什么?
  • volatile本质是在告诉vm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取;
    synchronize则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞。
  • volatile仅能实现变量的修改可见性,不能保证原子性;synchronize可以保证变量的修改可见性和原子性。
  • volatile不会造成线程的阻塞;synchronize可能会造成线程的阻塞。
  • volatile标记的变量不会被编译器优化,synchronize标记的变量可以被编译器优化
20.synchronized 和 Lock 有什么区别?

synchronized是关键字,属于jvm层面;Lock是具体类,是api层面的锁;

synchronized无法获取锁的状态,Lock可以判断;

synchronized用于少量同步,Lock用于大量同步。

21.synchronized 和 ReentrantLock 区别是什么?

synchronized代码执行结束后线程自动释放对锁的占用;Reentrantlock需要手动释放锁;

synchronized不可中断,除非抛出异常或者执行完成;Reentrantlock可中断;

synchronize非公平锁;Reentrantlock默认非公平锁,也可公平锁;

ReentrantLock用来实现分组唤醒需要唤醒的线程,可以精确唤醒,而不是像synchronized要么随机唤醒一个,要么唤醒全部线程。

22.说一下 atomic 的原理?

作用:多线程下将属性设置为atomic可以保证读取数据的一致性。

CAS(Compare And Swap),乐观锁的机制,先比较再交换,以实现原子性

23.理解乐观锁和悲观锁

乐观锁:认为每次去拿数据的时候别人不会修改,所以不会上锁,但是每次要拿数据的时候都会先判断数据是否被别人修改

悲观锁:认为每次去拿数据的时候别人都会修改,所以每次都会上锁。

使用场景:乐观锁使用于多读少写的应用类型,这样可以提高吞吐量;相反的情况则使用悲观锁

四、反射

1.什么是反射?

java反射机制是指在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法,对于任意一个对象,都能够调用它的任意一个方法和属性,这种动态获取的信息以及动态调用对象的方法的功能成为java的反射机制。

2.什么是 java 序列化?什么情况下需要序列化?

序列化:将java对象转换成字节流的过程。

反序列化:将字节流转换成java对象的过程。

当java对象需要在网络上传输或者持久化存储到文件中时,就需要对Java对象进行序列化处理。

序列化的实现:类实现Serializable接口。

3.动态代理是什么?有哪些应用?

在运行时,创建一个新的类,即创建动态代理,可以调用和扩展目标类的方法。动态代理的类是自动生成的。

应用:Spring的AOP,加事务,加权限,加日志

4.怎么实现动态代理?

基于jdk,需要实现InvocationHandler接口,重写invoke方法。

基于cglib,需要jar包依赖;

基于javassist

五、对象克隆
61.为什么要使用克隆?

如果直接使用=给对象赋值的话,那么两个对象其实指向的是同一个地址,其中一个值改变时,另一个也会随之改变。

62.如何实现对象克隆?

1、实现Coloneable接口并重写Object类中的clone()方法;

2、实现Serializable接口,通过对象的序列化和反序列化实现克隆,可以实现真正的深度克隆。

63.深克隆和浅克隆区别是什么?

深克隆:新旧对象不共享一个地址;

浅克隆:新旧对象共享一个地址,改变一个,另一个也会改变

六、Java Web

1.jsp 和 servlet 有什么区别?

Jsp:Java Server Page,是一种动态页面技术,其根本是一个简化的Servlet设计,用来封装产生动态网页的逻辑处理。

Servlet:服务器端的Java应用程序,具有独立于平台和协议的特性,可以生成动态的Web页面。它担当客户请求与服务器响应的中间层。

相同点:jsp经编译后就变成了Servlet,jsp本质就是servlet,jvm只能识别java的类,不能识别jsp代码,web容器将jsp的代码编译成jvm能够识别的java类。

2.jsp 有哪些内置对象?作用分别是什么?
  • request:用户端请求(get/post)
  • response:网页传回用户端的响应
  • pageContext:管理网页的属性
  • session:与请求有关的会话期
  • application servlet:正在执行的内容
  • out:用来传送回应的输出
  • config: servlet的架构部件
  • page JSP:网页本身
  • exception:针对错误网页,未捕捉的例外
3.说一下 jsp 的 4 种作用域?
  1. application:在所有应用程序中有效
  2. session:在当前会话中有效;
  3. request:在当前请求中有效;
  4. page:在当前页面有效
4.session 和 cookie 有什么区别?
  • 存储位置不同
    cookie的数据信息存放在客户端浏览器上
    session的数据信息存放在服务器上
  • 存储容量不同
    单个cookie保存的数据<=4Kb,一个站点最多保存20个cookie
    对于session来说没有上限
  • 存储方式不同
    cookie中只能保管ASCII字符串,并需要通过编码方式存储为Unicode字符或者二进制数据;
    session中能够存储任何类型的数据
  • 隐私策略不同
    cookie对客户端是可见的,所以它是不安全的;
    session存储在服务器上,对客户端是透明的,不会信息泄露
  • 有效期不同
    可以通过设置cookie的属性,使cookie长期有效;
    session不能达到长期有效的结果
  • 服务器压力不同
    cookie保存在客户端,不占用服务器资源
    session是保存在服务器的,如果并发访问的用户十分多,会产生很多的session,耗费大量的内存
  • 浏览器支持不同
    cookie是需要浏览器支持的,假如客户端禁用了cookie,或者不支持cookie,则会话跟踪会失效
    session只能在本窗口以及子窗口有效,而cookie可以为本浏览器上的一切窗口有效
  • 跨域支持不同
    cookie支持跨域名访问
    session不支持跨域名访问
5.说一下 session 的工作原理?

客户端登录完成之后,服务器会创建相应的session,session创建完成之后,会把session的id发送给客户端,客户端再存储到浏览器中。这样客户端每次访问服务器时,都会带着sessionid,服务器拿到sessionid之后,在内存找到与之对应的session就可以正常工作了。

6.如果客户端禁止 cookie,session 还能用吗?

如果浏览器禁用了cookie,那么客户端访问服务端时无法携带sessionid,服务端无法识别用户身份,便无法进行会话控制,session就会失效,但是可以通过其他办法实现:

  1. 通过URL重写,把sessionid作为参数追加的原URL中,后续的浏览器与服务器交互中携带session
  2. 服务器的返回数据中包含sessionid,浏览器发送请求时,携带sessionid参数
7.spring mvc 和 struts 的区别是什么?
  • 拦截机制不同
    Struts2是类级别的拦截,每次请求就会创建一个Action
    SpringMVC是方法级别的拦截,一个方法对应一个Request上下文。
  • 底层框架不同
    Struts2采用Filter实现,SpringMVC采用Servlet实现
  • 性能不同
    Struts2需要加载所有的属性值注入,SpringMVC实现了零配置,由于SpringMVC基于方法的拦截。
    所以,SpringMVC开发效率和性能高于Struts2
  • 配置方面
    SpringMVC 和 Spring 是无缝的,从这个项目的管理和安全上也比Struts2高。
8.如何避免 sql 注入?

SQL注入是Web开发中最常见的一种安全漏洞,可以用它来从数据库获取敏感信息,进行数据库的一系列非法操作。

  • 校验参数的数据格式是否合法
  • 对进入数据库的特殊字符进行转义处理,或编码转换
  • 预编译SQL,参数化查询方式,避免SQL拼接
  • 发布前利用工具进行SQL注入检测
9.什么是 XSS 攻击,如何避免?

XSS(Cross Site Scripting)跨站脚本攻击,它是Web程序中常见的漏洞。

原理:攻击者往web页面里插入恶意的HTML代码,当用户浏览该页面时,嵌入其这个你的HTML代码会被执行,从而达到恶意攻击用户的目的。

避免措施:

  • web页面中可由用户输入的地方,对输入的数据转义、过滤处理
  • 前端对HTML标签属性、css属性赋值的地方进行校验
  • 后台输出页面的时候,也需要对输出内容进行转义、过滤处理
10.什么是 CSRF 攻击,如何避免?

CSRF(Cross-site request forgery),也被称为one-click attack 或者 session riding,通常缩写为CSRF或XSRF,

是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。

预防措施:

  • 验证HTTP Referer字段
  • 验证码
  • 添加token验证
  • 尽量使用post,限制get

 篇幅限制下面就只能给大家展示小册部分内容了。整理了一份核心面试笔记包括了:Java面试、Spring、JVM、MyBatis、Redis、MySQL、并发编程、微服务、Linux、Springboot、SpringCloud、MQ、Kafka 面试专题

需要全套面试笔记【点击此处即可】免费获取

七、异常

1.throw 和 throws 的区别?

throw:表示方法内抛出某种异常对象,如果异常对象不是RuntimeException,则需要在方法声明时加上该异常的抛出,即需要加上throws语句,或者在方法体内try catch异常,否则编译会报错;执行到throw语句则后面的语句块不再执行

throws:方法的定义上使用此关键字表示这个方法可能抛出某种异常,需要由方法的调用者进行异常处理。

2.final、finally、finalize 有什么区别?

final:修饰类时表示不能被继承;修饰方法时表示不能被重载;修饰变量时表示不能被修改。

finally:在异常处理时提供finally代码块来执行异常处理。

finalize:是方法名,java允许使用finalize()方法在垃圾收集器将对象从内存中清除之前做必要的清理工作。

3.try-catch-finally 中哪个部分可以省略?

catch 和 finally可以被省略其中一个,finally代码块是无论是否捕捉到异常,都会执行finally代码块的逻辑。

4.try-catch-finally 中,如果 catch 中 return 了,finally 还会执行吗?

捕获到异常后,不会直接返回,会先执行完finally代码块的语句继续执行catch代码块中的return。

5.常见的异常类有哪些?

NullPointerException、SQLException、IndexOutOfBoundException、NumberFormatException、FileNotFoundException

IOException、IllegalArgumentException、NoSuchMethodException

八、网络

1.http 响应码 301 和 302 代表的是什么?有什么区别?

301:Moved Permanently ——被请求的资源已经永久移动到新位置

302:Found——被请求URL临时转移到新的URL

其他的响应码:

信息响应(100-199)、成功响应(200-299)、重定向(300-399)、客户端错误(400-499)、服务器错误(500-599)

2.forward 和 redirect 的区别?
  • redirect是客户端发起的请求;forward是服务端发起的请求
  • redirect浏览器显示被请求的URL;forward浏览器地址不显示被请求的URL
  • redirect重新开始一个request,原页面的request生命周期结束;
    forward另一个连接的时候,request变量是在其生命周期内的。
  • redirect实质上是两次HTTP请求;forward是一次请求
3.简述 tcp 和 udp的区别?
  • TCP是面向连接的,TCP提供可靠的服务,通过TCP连接传输的数据不会丢失,没有重复,并且按顺序到达。
    UDP是无连接的,没有可靠性,但是速度快,操作简单,要求系统资源较少,可以实现广播发送。
  • TCP是面向字节流的,UDP是面向报文的;TCP是全双工的可靠信道,UDP是不可靠信道
4.tcp 为什么要三次握手,两次不行吗?为什么?
  • 两次握手只能保证单向连接是畅通的。
  • 只有经过第三次握手,才能确保双向都可以收到对方发送的数据
5.说一下 tcp 粘包是怎么产生的?

TCP粘包:发送方发送的多个数据包,到接收方缓冲区首尾相连,粘成一包,被接收

产生原因:TCP为提高传输效率,发送方往往要收集到足够多的数据后才发送一包数据。若连续几次发送的数据都很少,通常TCP会根据优化算法把这些数据合成一包后一次发送出去,这样接收方就收到了粘包数据。

接收方原因:接收方引起的粘包是由于接收方用户进程不及时接收数据,从而导致粘包现象。这是因为接收方先把收到的数据放在系统接收缓冲区,用户进程从该缓冲区取数据,若下一包数据到达时前一包数据尚未被用户进程取走,则下一包数据放到系统接收缓冲区时就接到前一包数据之后,而用户进程根据预先设定的缓冲区大小从系统接收缓冲区取数据,这样就一次取到了多包数据。

6.OSI 的七层模型都有哪些?

OSI(Open System Interconnection Reference Model)开放式系统互联网通信

应用层、表达层、会话层、传输层、网络层、数据链路层、物理层

7.get 和 post 请求有哪些区别?
  • get是从服务器上获取数据;post是向服务器传送数据
  • get请求通过URL直接请求数据,数据信息可以在URL中看到;post请求是放在请求头中的,用户看不到;
  • get传送的数据量小,有限制,不能大于2kb,post传送的数据可以没有限制
  • get安全性比较低,post相对较安全
8.如何实现跨域?
  • 使用JSONP,利用了script不受同源策略的限制;
  • 代理跨域请求;
  • HTML5 postMessage方法;
  • 修改document.domain跨子域;
  • 基于HTML5 websocket协议
9.说一下 JSONP 实现原理?

同源:同协议、同主机、同端口号

json是一种数据格式,jsonp是一种数据调用的方式,带callback的json就是jsonp。

首先在客户端注册一个callback,然后把callback的名字传给服务器,此时,服务器先生成json数据,然后以JavaScript语法的方式,生成function,返回给客户端,客户端解析script,并执行callback函数。

简单的说,就是利用script标签没有跨域限制的"漏洞"来达到与第三方通讯的目的。

10.单工、半双工、全双工

单工:只支持数据在一个方向上传输;

半双工:允许数据在两个方向上传输,但在某一时刻,只允许数据在同一个方向上传输;

全双工:允许数据可以同时接收和发送信息,实现双向通信

九、设计模式

1.说一下你熟悉的设计模式?

单例模式:懒汉式(先声明变量,等到实际用到时再创建对象)饿汉式(直接创建对象)

工厂模式:工厂类可以根据条件生成不同的子类实例,这些子类有一个公共的抽象父类并且实现了相同的方法,但是这些方法针对不同的数据进行了不同的操作。

适配器模式:把一个类的接口变换成客户端所期待的另一种接口,从而使原本因接口不匹配而无法在一起使用的类能够在一起工作。

模板方法模式:提供一个抽象类,将部分逻辑以具体方法或构造器的形式实现,然后声明一些抽象方法来迫使子类实现剩余的逻辑,不同的子类可以从不同的方式实现这些抽象方法,从而实现不同的业务逻辑。

2.简单工厂和抽象工厂有什么区别?
  • 简单工厂
    由一个工厂对象创建产品实例,简单工厂模式的工厂类一般是使用静态方法,通过不同的参数创建不同的对象的实例。可以生产结构中的任意产品,不能增加新的产品。
  • 抽象工厂
    提供一个创建一系列相关或相互依赖对象的接口,而无需制定他们具体的类,生产多个系列产品,生产不同产品族的全部产品,不能新增产品,可以新增产品族。

十、Spring/Spring MVC

1.为什么要使用 spring?
  • 方便解耦,便于开发
  • 支持aop编程
  • 声明式事务的支持
  • 方便程序的测试
  • 方便集成各种优秀的框架
  • 降低JavaEE API的使用难度
2.解释一下什么是 aop?

AOP(Aspect Oriented Programming)面向切面编程

通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。

通俗的解释:在运行时,动态的将代码切入到类的指定方法、指定位置的编程思想就是面向切面的编程。

3.解释一下什么是 ioc?

IOC(Inversion Of Control)控制反转

它是一种设计思想,在java开发中,将设计好的对象交给容器控制,而不是显示地用代码进行对象的创建。

把创建和查找依赖对象的控制权交给IOC容器,由IOC容器进行注入、组合对象,这样对象与对象之间是松耦合,便于测试,功能可复用,使得程序的整个体系结构可维护,灵活性、扩展性变高。

4.spring 有哪些主要模块?
  1. Spring Core
    框架的基础部分,提供IOC容器,对bean进行管理。
  2. Spring Context
    基于bean,提供上下文信息,扩展出JNDI、EJB、电子邮件、国际化、校验和调度等功能。
  3. Spring DAO
    提供了JDBC的抽象层,它可消除冗长的JDBC编码和解析数据库厂商特有的错误代码,还提供了声明性事务管理方法
  4. Spring ORM
    提供了常用的“对象/关系”映射APIs的集成层。其中包括JPA、JDO、hibernate、Mybatis等。
  5. Spring AOP
    提供了面向切面编程。
  6. Spring Web
    提供了基础的Web开发的上下文信息,可与其他Web进行集成。
  7. Spring Web MVC
    提供了Web应用的Model-View-Controller 全功能实现。
5.spring 常用的注入方式有哪些?

构造方法注入、setter注入、基于注解的注入

6.spring 中的 bean 是线程安全的吗?

Spring 中的Bean本身不具备线程安全的特性

7.spring 支持几种 bean 的作用域?
  • singleton:单例,默认作用域
  • prototype:原型,每次创建一个新对象
  • request:请求,每次Http请求创建一个新对象,适用于WebApplicationContext环境下
  • session:会话,同一个会话共享一个实例,不同会话使用不同的实例
  • global-session:全局会话,所有会话共享一个实例
8.spring 自动装配 bean 有哪些方式?
  • default:默认的方式和no方式一样
  • no:不自动装配,需要使用<ref/>节点或参数
  • byName:根据名称进行装配
  • byType:根据类型进行装配
  • constructor:根据构造函数进行装配
9.spring 事务实现方式有哪些?
  • 编程式事务管理,需要在代码中调用beginTransaction()、commit()、rolback()等事务管理相关的方法
  • 基于TransactionProxyFactoryBean的声明式事务管理
  • 基于@Transactional的声明式事务管理
  • 基于Aspectj AOP配置事务
10.说一下 spring 的事务隔离?
  • 事务产生的问题
名称数据的状态实际行为产生原因
脏读未提交打算提交但是数据回滚了,读取了提交的数据数据的读取
不可重复读已提交读取了修改前的数据数据的修改
幻读已提交读取了插入前的数据

数据的插入

  • 事务隔离级别

名称

结果脏读不可重复读幻读
Read UnCommitted(读未提交)什么都不解决
Read Committed(读提交)解决了脏读的问题
Repeatable Read(重复读)解决了不可重复读
Serializable(序列化)解决所有问题
11.说一下 spring mvc 运行流程?
  • 用户向服务器发送请求,请求被 Spring 前端控制 Servelt DispatcherServlet 捕获。(捕获)
  • DispatcherServlet对请求 URL进行解析,得到请求资源标识符(URI)。然后根据该  URI,调用 HandlerMapping获得该Handler配置的所有相关的对象(包括  Handler对象以及   Handler对象对应的拦截器),最后以 HandlerExecutionChain对象的形式返回;(查找   handler)
  • DispatcherServlet  根据获得的 Handler,选择一个合适的  HandlerAdapter。提取Request 中的模型数据,填充 Handler 入参,开始执行 Handler(Controller), Handler执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象(执行 handler)
  • DispatcherServlet  根据返回的 ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到 Spring 容器中的 ViewResolver) (选择 ViewResolver)
  • 通过 ViewResolver 结合 Model 和 View,来渲染视图,DispatcherServlet 将渲染结果返回给客户端。(渲染返回)

总结:核心控制器捕获请求、查找Handler、执行Handler、选择ViewResolver,通过ViewResolver渲染视图并返回

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值