Java常见的面试题

一:springmvc请求流程

1:用户发送请求到tomcat

2:tomcat查看请求的url是否符合DispatcherServlet的拦截规则,如果符合则将请求交由DispatcherServlet去进行处理,如果不符合则直接404。

3:DispatcherServlet接收到请求后,去查看handlerMapping中是否有对应的映射,如果没有直接404

4:如果找到了对应的handlerMapping,那么handlerMapping会将请求映射为一个handlerExecutionChain对象(里面封装了handler与多个拦截器对象)然后将其返回给DispatcherServlet。

5:DispatcherServlet通过HandlerAdapter来执行Handler。

6:Handler执行完成之后会返回给HandlerAdapter一个ModelAndView对象。

7:HandlerAdapter将ModelAndView返回给DispatcherServlet。

8:DispatcherServlet去请求viewResolvers进行视图的解析(根据逻辑视图找到真实视图)

9:视图解析器返回视图后,DispatcherServlet对视图进行渲染(将数据写入到页面中)

10:视图解析器将视图返回给DispatcherServlet

11:DispatcherServlet将视图响应给用户。

二:spring常用设计模式

1:工厂模式

2:单例模式

3:适配器模式

4:包装器模式

5:代理模式

6:观察者模式

7:策略模式

8:装饰器模式

9:模版方法模式

三:什么是ioc,什么是di

控制反转:之前的所有对象都是由我们在程序之中手动new出来的,而使用spring之后我们所有的对象都有spring容器去创建,我们需要使用的时候只需要从容器中获取即可(反转创建对象的权利)。

依赖注入:spring在创建对象的过程中,将对象中所依赖的属性注入到对象之内(给创建的对象赋值)。

四:什么是AOP,AOP主要依靠什么实现

面向切面编程,AOP能够将与业务无关,但是又被所有业务模块共用的代码抽离出来,使用动态代理技术在容器的运行期间,动态的织入其中,减少重复代码,降低耦合度,提升系统的可维护性,并且spring的AOP事务管理功能十分强大。
AOP主要依靠动态代理实现。

五:数据库的事务,数据库的隔离级别

(一):原子性;
(二)一致性;
(三)隔离性;
(四)持久性;
读未提交,读已提交,可重复度,串行化

六:什么是悲观锁,什么是乐观锁,如果实现两种锁

悲观锁
就是很悲观,每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据就会block直到它拿到锁。传统的关系型数据库里边就用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。它指的是对数据被外界(包括本系统当前的其他事务,以及来自外部系统的事务处理)修改持保守态度,因此,在整个数据处理过程中,将数据处于锁定状态。悲观锁的实现,往往依靠数据库提供的锁机制
乐观锁
就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。乐观锁适用于多读的应用类型,这样可以提高吞吐量
乐观锁实例:
select version from user;update user set username='zhangsan1',version=version+1 where id=1 and version=10012;
悲观锁实例:
begin; select username from user where id = 1 and version=10014 for update; update user set username='zhangsan4',version=version+1 where id = 1; commit;

七:分布式与集群的区别

分布式: 牵扯到项目的拆分,将一个完整的项目拆分成多个模块,并且每个模块都能独立部署以及运行
集群: 项目的部署,将一个单独的项目部署在多台服务器上就叫做集群,将分布式项目中每一个模块都部署在多台服务器上就叫 分布式+集群

八:什么是rpc,为什么要用dubbo

RPC(Remote Procedure Call):远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的思想。RPC 是一种技术思想而非一种规范或协议,常见 RPC 技术和框架有:
应用级的服务框架:阿里的 Dubbo/Dubbox、Google gRPC、Spring Boot/Spring Cloud。
远程通信协议:RMI、Socket、SOAP(HTTP XML)、REST(HTTP JSON)。
通信框架:MINA 和 Netty。

  1. 透明化的远程方法调用,底层封装了 Java NIO 通信框架 Netty、序列化及反序列化框架、以及应用层提供线程池和消息调度,使业务可以快速的实现跨进程的远程通信,就像调用本地服务那样去调用远程服务,而不需要关系底层的通信细节,例如链路的闪断、失败重试等,极大的提高了应用的开发效率。
  2. 软负载均衡及容错机制,可以在内网替代 F5 等硬件负载均衡器,降低成本,减少单点。
  3. 服务自动注册与发现,基于服务注册中心的订阅发布机制,不再需要写死服务提供方地址,注册中心基于接口名查询服务提供者的ip地址,并且能够平滑添加或删除服务提供者。
  4. 服务治理,包括服务注册、服务降级、访问控制、动态配置路由规则、权重调节、负载均衡。
  5. Spring 框架无缝集成、配置化发布服务。

九:什么是nginx,什么是反向代理

是一个优秀的web服务器,其反向代理功能十分强大,依靠其反向代理可以实现负载均衡。

正向代理
由用户告知代理服务器需要访问的真实服务器地址,而代理服务器根据用户指定的服务器地址去访问对应服务,并对服务器隐藏真实的用户信息。

反向代理
客户端提供给用户的是代理服务器地址,对用户隐藏了真实服务器地址,对于用于用户而言并不知道自己使用了代理服务器。
正向代理代理的对象是客户端,反向代理代理的对象是服务端

十:支付宝支付流程

用户使用支付宝付款
1:商户客户端请求后台服务器获取签名后的订单信息
2:后台服务器返回给客户端签名后的信息
3:客户端调用支付宝客户端的支付接口
4:支付宝客户端向支付宝服务端发送支付请求
5:支付宝服务端完成支付
6:向支付宝客户端返回支付结果
7:支付宝客户端将支付结果显示给客户端
8:客户端将支付结果返回给服务器进行验签,解析
9:服务器将最终支付结果返回给客户端
10:客户端将支付结果显示给用户
11:支付宝服务端异步发送支付通知给服务器
12:服务器响应支付宝服务端的通知

简易流程:
1:服务器生成前面后的订单信息返回给客户端
2:客户端调用支付接口,并获取接口的支付结果
3:同步支付结果给服务器进行验签,解析
4:服务器将支付结果返回给客户端,并展示给用户
5:支付宝异步向服务器发送支付通知
6:服务器(修改订单状态并)响应支付宝的通知。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小郑要做干饭人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值