蚂蚁金服一面复盘

蚂蚁金服一面复盘

面试官先打电话确认,问我现在的基本情况,看现在有没有时间进行面试,可能是因为之前进行过一次阿里的面试,所以减去了自我介绍,直接开整,有点不然套路出牌呀。不过由于晚上在工作室做事,脑袋还是有点懵,发挥的不是很好,复盘是为了下一次更好!

正文

面试官:简单问几个问题,最近在做的是流浪所,这个项目是有好几个人在做吗?(看是不是项目的核心成员什么的)

我:这是我个人在做的

面试官:就是纯自学,是吧?

我:对

面试官:有没有什么有谁要用啊?

我:一般是自己用的,因为它主要是一个个人的博客系统,想自己学的一些技术文章发布到上面,方便后面自己学习查看

面试官:那你知道这个系统想对外的话,要怎么操作?(操作系统和运维方面的知识)

我:对外的话,就是在服务器上发布。我现在的话,就是Linux系统,买了一个Ubuntu的服务器,打成jar包,直接发布到上运行。使用的是华为云,在华为云开启对应的安全组,就可以访问了

面试官:有域名的吗

我:有的

面试官:ok,是jar包吗?

我:是的,打成jar包,只要在服务器上安装一个java的虚拟环境

面试官:SpringBoot的,是吧?

我:对,采用的就是SpringBoot+Vue的技术

面试官:那SpringBoot发送的http的话是通过什么方式发布出去的啊?

我:嗯,您好,我没有听清楚您要表达的意思,可以再讲述一遍吗?

面试官:就是web容器嘛,它的web容器是什么?

我:SpringBoot内嵌的是Tomcat的容器,但是我用的了那个Undertow容器,因为我看到过那个阮一峰的文章讲,这个容器相比较内嵌的Tomcat容器会好一点

面试官:比那个好一点吗?

我:对,就相当于在处理并发这些,都会有优势

详情见:https://blog.csdn.net/m0_49068745/article/details/110271066

大家也可以自行百度:为什么越来越多的SpringBoot开发者选择了Undertow?

面试官:你这个工程是怎么搭起来的?

我:用的开发用户是IDEA,SpringBoot是直接选择SpringBoot Initializr。官方的那个spring.io比较慢,是国外的,我导入使用的是阿里云的,新建的时候从这里去下载

官方:https://start.spring.io/

阿里云:https://start.aliyun.com/

面试官:啥意识,没听懂

我:嗯,您问的是怎么去搭建一个SpringBoot项目吗?

面试官:对

我:就是使用IDEA工具,它里面有一个SpringBoot初始化的选项,然后就快速的帮我搭建出这个项目,这样就可以了

面试官:SpringBoot初始化吗?

我:对

面试官:哪个IDEA?

我:IntelliJ IDEA

面试官:现在有新建SpringBoot工程的吗?

我:有啊,当然可以不用这种方法,你也直接去官网上下载,都可以的。只要选择对应的元数据项,就直接从那里下载。当然Intellij里面初始化的话,更加方便。你也可以新建项目,也是可以达到这个效果的。

面试官:那Maven你用过没有?

我:Maven,它初始化的时候就是使用的Maven做统一的版本管理

面试官:那你用IDEA其实就是新建Maven呗

我:对,如果你选择直接初始化的话,它会自动地帮我们把pom.xml统一管理这些弄进去

面试官:那个tomcat是怎么集成进去的?

我:两种方法,一种是在初始化的时候,你可以选择那个Web依赖直接导入,另一种的话是开始的时候不到依赖,直接在pom.xml里面导入web依赖

面试官:怎么导?

我:就是pom.xml里面的dependency,因为SpringBoot内嵌了tomcat,只需要导入spring-boot-start-web嘛,然后就可以了

面试官:那如果想改端口号怎么改啊?

我:端口号的话,就是在那个properties配置文件,这里的server.port就是用来改我们的端口号

面试官:那我想改http协议,怎么改?

我:嗯,http协议?

面试官:比如说我想用那个长连接的话

我:这个没有去修改过,不是太熟悉

面试官:你还改过什么?

我:你是指哪方面改过什么?

面试官:就maven里面

我:maven里面更多就是导依赖嘛

面试官:打jar包的话要指定一些东西,SpringBoot需要怎么弄?

我:我没有太听清您的意思,可以再讲述一遍吗?

面试官:打jar包的时候,比如说有这种图片文件,想打到jar包里面怎么打?

我:maven里面有一个build,在这个文件里面有那个exclusion排除选项,在这里面可以把html、css、js等文件排除

面试官:你这从哪学的啊?

我:从网上,视频和博客学的

面试官:没有成套吗?都是一点一点学的

我:有的,因为有看过哪种学习路线,就是从学习路线一直下来。就是先通过视频学习,了解个大概,然后再去看相关的技术文章,再加以实践嘛

面试官:ok,那个maven的生命周期知道吗?

我:maven的生命周期

面试官:对

我:这个不是特别清楚的

面试官:tomcat的生命周期知道吗?

我:生命周期这方面不怎么了解

面试官:那个http的请求过程,知道吗?

我:知道的,您是指三次握手和四次挥手吗?

面试官:可以呀

我:第一次,从客户端发送到服务器的时候,就是建立连接。相当于客户端跟服务器说,我想建立连接了,这是第一次握手。然后第二次的话,就是服务器接到了客户端发送的建立连接的请求,接受到了就是第二次握手。第三次的话,就是接受了请求之后把响应返回给客户端,这就是第三次握手。然后四次挥手的话,相当于客户端跟服务端说,我需要断开连接,这是第一次挥手。第二次的话就是服务端接收到了客户端需要断开连接的请求,这就是第二次挥手。然后第三次的话就是服务端接受到了请求,但是可能服务端还有数据在传送嘛,不能立马把这个连接断开,需要一段时间把这些资源发送完毕,这是第三次挥手。第四次的话,就是服务端发送完毕之后,服务端就是把消息告诉客户端说,ok,你可以断开连接了。然后三次握手和四次挥手大概就是这样一套流程。

面试官:那个tomcat容器里面的,就是不是用那个框架的,你直接写过没,就Servlet?

我:Servlet,JavaWeb里面的,客户端发送请求之后,会到那个web.xml配置文件,那里有Servlet-mapping。比如发送一个/hello的请求,就是在这里面可以找到servlet-mapping,然后就可以找到具体要到那一个servlet里面

面试官:嗯,那个doPost、doGet、doAfterHandler这些东西关系知道吗?

我:知道的,doGet和doPost的话,就是对应lget和post两个请求,这里doGet和doPost都是一套的流程代码,说一这里我没会有一个调用的关系。比如我没把处理业务逻辑写导doGet里面,就不需要在doPost里面再去重复的写一遍,doPost只需要调用doGet里面的方法就可以了。

面试官:嗯。然后别的呢?

我:您是指什么?

面试官:doAfterHandler

我:Handler的话,就是一个处理器。比如说我们可以在这里对数据进行一些数据的处理之类的。

面试官:嗯,doAfterHandler

我:我没有听清楚您的意思?

面试官:就是那个一次http请求,然后Servlet的处理会经过很多个方法,方法的顺序,知道吗?

我:噢,这个啊。就是doChain,这是一个链式编程,如果我们有很多个拦截器一样,需要doChain=true,这样就是第一个拦截器之后,继续执行。不会说,第一个拦截器拦截玩之后就直接pass掉了。

面试官:嗯,那几个访问顺序?

我:呃

面试官:preHandler

我:preHandler,就是进入Servlet之前,有一个前置处理,有一个后置处理嘛

面试官:名称知道吗?

我:名称的话,不是特别清楚了。JavaWeb已经有段时间没有去使用,最近在用那个SpringBoot、SpringMVC用的更多一点?

面试官:就是在看这些东西,是吗?

我:啊

面试官:就是SpringBoot相关的,对嘛

我:是,SpringBoot、SSM更多一点

面试官:那我就问这些方面的,Spring在接收到请求的时候,会经历那些方法,知道吗?

我:SpringMVC的执行流程

PS:这里有点卡壳了几分钟,之前在写东西,脑袋还是有点翁翁的,浆糊的感觉,就直接跳过了。这里面试官也是直接打开连接,进到我的博客里面看了,哎!!!

我:SpringMVC的执行流程,它总体上就是更多的帮我们做了封装,它有一个中心,前端处理器DispatcherServlet,然后它就受到请求的话,会先经过我们的HandlerMapping处理器映射器,然后返回我们的前端控制器,再去请求处理器适配器HandlerAdapter,这里才是调用我们的Handler处理器,Controller,在这里的话就是调用我们业务处理,最后就会返回我们的结果ModelAndView,最后经过View Resolver视图解析器,然后将数据返到导我们的视图,jsp或html里面,响应http请求,返回给浏览器

面试官:ok,handlerMappring是吧?

我:对

面试官:加载的过程知道吗?

我:不是特别记得了

面试官:Spring Bean的加载过程,你知道吗?

我:这个也不是特别清除

面试官:Spring Bean声明的话不是要写注解或者xml文件?

我:就是先解析我们的xml文件,它里面的扫描类,从配置或者我们的注解里面获取bean的定义信息,然后再去加载。

面试官:bean里面的成员信息,比如A的成员有一个B的成员bean,然后这个bean是怎么进入里面的?

我:可以再描述一遍吗?

面试官:比如说一个UserService的bean,一个UserDao的bean,数据库层的bean,框架是怎么把这个注进去的?

我:mybatis就是mapper层,mapper层里面会有接口,接口里面定义了方法,然后在xml文件里面那个namespace

对应我们的包名,有bean的id相对应我们的方法名。

面试官:我看有人问过登录的是吧?登录是怎么做的?

我:登录的话就是前端把用户名和密码发送到服务器,发到服务器之后,首先我们会查询一下数据库,看用户名和密码是否正确,如果正确的话,就会生成一个token,返回个客户端,我们客户端就会存储token。

面试官:客户端,手机端是吧?

我:对

PS:脑子有点懵,为后来埋下了伏笔!!!

我:然后第一次的话就会生成SessionID,然后就会把这个SessionID返还给客户端。客户端后续发送的时候就会把这个存储在cookie里面的SessionID发送到服务器,服务器就会验证这个SessionID是否是正确的,如果是正确的就不需要再次登录了,如果不是的话就会退出去。

面试官:SessionID存在那里的?

我:SessionID是存在服务器的,服务器的话可以存在内存里面嘛

面试官:内存里面?

我:对

面试官:如果有两台服务器呢?

我:两台服务器的话,我们就可以把这个SessionID生成的时候存储到数据库里面,然后后续的话,可以从数据库里面查。我看过相关文章说是比较麻烦,了解到可以使用Redis方法处理

面试官:比较麻烦是怎么意思?

我:就是每次都需要查询我们的数据库,这样的话会增加我们的操作,增加服务器的负担

面试官:服务器的负担吗?

我:对,如果用户量多一点的话,相当于每次的话,都需要去查询数据库,这样就增加了我们的消耗。如果使用Redis的话,就是有一个类似黑白名单一样的东西,就可以实现这个操作

面试官:黑白名单?

我:黑名单和白名单,就相当于在Redis里面放进去一个SessionID就是有效的,如果登录超时的话,就会把SessionID标记为过时的。如果下次再发送的话,它就可以检测到,不让你去操作,需要重新登陆嘛

面试官:登录的话,一般不是有效期嘛,有效期怎么搞?

我:用jwt安全登录的话,再生成token令牌的时候,哪里有一个字段,可以设置我们的登录有效期

面试官:jwt是什么?

我:jwt的话就是token令牌

面试官:谁提供的?

我:应该是Apache?

面试官:它怎么生成令牌的?

PS:有点忘记了!

面试官:如果不用这个工具的话,怎么生成这个令牌?

我:jwt就是生成token令牌的东西

面试官:生成规则是什么?

我:不是特别记得了

面试官:你刚才说的是手机端的交互,浏览器怎么保证前端交互的?

我:您是指浏览器哪方面?

面试官:算了,这个就不问了,jdk里面的锁,你用过没?

我:用过

面试官:我就问一个吧,读写分离锁,它是怎么实现的

我:读写分离锁,就相当于访问一个文件的时候,先看你有没有这个读的权限,如果有的话就把你放进来,就是跨域访问这个文件。写锁的话就是你可以浏览了之后,如果你想要修改其中的内容的时候就是它会判断有没有写的权限,如果有的话就可以修改。

面试官:这个在锁里面实现原理用的是什么东西?

我:ReadWriteLock

面试官:读和写的时候,用什么东西控制?

我:嗯,应该是Synchronized。

面试官:锁得是什么东西呢?

我:它锁定是对象

面试官:什么对象?

我:不是特别了解

面试官:这个有没有看过

我:没有,看的不多,就是了解到synchronized和lock锁

面试官:回到刚才那个场景,Spring Bean,Controller里面定义了一个变量,这个可能会有什么问题?

我:可以具体讲述一下嘛

面试官:嘿嘿,这个主要看一下您了解不了解场景

我:正常在Controller里面写一个变量不应该遇到什么问题啊

面试官:如果这么用来,可能出现什么问题?

我:我好像在定义变量里面遇到什么问题,您总不可能说定义相同变量,这种操作叭

面试官:比说,你想统计登录人数?

我:定义一个count,登录的时候count++

面试官:有并发问题吗?

我:并发这方面还没有考虑过

反问

面试官:差不多了,您有什么想问的吗?

我:这次面试有哪些不足的地方(多了解一下自身)

面试官:其实你作为本科生啊,其实已经是很不错了,但是大部分都是实践,实践的东西比较多,理论的东西在Java的框架层面上还可以的,但是java的底层原理上和各种工具,比如最明显的并发,原理方面了解的还是有点少。但是最为一个本科生来说,很不错了。

我:这方面我觉得就是要有一个相对广度的了解,再去深度了解嘛

面试官:毕业生的话,广度要了解,没问题的。但是Java本身的深度是首要解决的东西,最关注的点。校招,对于毕业生,对于java本身的这些方面,要求会比较高。

我:ok,了解了

面试官:框架层面上,比如Maven了解的还可以;SpringMVC还行,能到使用的层度;Java基础的并发这些不了解的话,比如说统计一下登录人数的话,不了解的话,就不太好

我:ok

面试官:JavaWeb方面的,了解的东西也不少了,对于一个本科毕业生,绝对够了。但是对于Java基础方面来说,还是有点少了。

我:好的,这方面后面会加强的

面试官:总体上,作为一个毕业生来说,还是可以的。比如说个人自学来说,还是比较多的。

我:如果有幸能够加入的话,我会参与哪方面的东西?

面试官:基本上的话还是工程,主要是Web开发为主。但是Web开发的话,作为技术人员,技术基础的话,可能是给三年左右的时间,超过三年就必须解决复杂业务问题。复杂问题的话,对于我们这种业务行开发,最核心的点就是怎么去解决业务问题。业务的场景的话,就是支付宝支付这条线,支付这条线有一个商家,比如说给每一个商家进行付款,围绕商家这一套支付和经营的工具之类的来做。

反思

总体上,阿里的面试体验还是很可以的,不论是自我介绍和反问环节,还是过程中引导,都是很不错的。

这次的面试,就我个人而言,状态方面说实话是比较差的。在工作室做事,头脑全是刚刚的问题,脑袋基本上全是浆糊的感觉。但是想想,这样也能更好的检测我现在的学习成果,于是还是开始了这次的面试。就问题而言,关于改http协议的话,确实没有操作过;长连接的话,听过确实不记得课堂知识了;maven的声明周期问题,我吐了呀,基本上常用maven clean、maven package、maven install之类的,我居然没注意;tomcat的生命周期,这种底层原理看过,但是这也是最容易忘记的;JavaWeb的拦截器,前置拦截、后置拦截,JavaWeb我都多久没用了,全凭脑子的记忆答得;SpringMVC、Spring、MyBatis这些,都是很熟悉的,全是状态原因,答得很不满意;还有就是登录的地方,还是得多屡屡逻辑;关于锁得话,synchronized和lock锁我都是记得得啊,确是没答好,乐观锁也是我现在写东西基本上会使用得,对应得悲观锁也是知道点的,反正就是讲的一塌糊涂;统计人数的话我都实现过,却是他喵没讲出来。并发问题,我还以为是高并发呢,现在仔细想想,就是想让我讲多线程嘛,虽然没有在真实项目实现过,但是小demo以前也是写过,比如说循环打印数字、买票问题等,结果啥都没说出来。说实在,我的表现,我自己都不满意。

==最重要的是调整好自己的状态,时刻准备着,至少不能说想要一样脑袋是浆糊就去面试了,可以约着下一次的时间去调整==

关于知识的话,我觉得可以自己画一个大纲,对应的知识点自己慢慢的去看,加以理解,然后深化到脑子里面,这样才是最有效果的。Java基础的,我也是有课堂学习,课后自学两三遍以上,但是时间久了就是记不住,别人的面经,资料也是看了,但是就是会忘记,没有真正理解,总归是要还回去的。即使准备八股文,稍微深入点问,就能看的出来,即使进去工作,也难以适应。很多问题,关乎细节,这就需要我们在平时学习的时候多去注意。

讲的有点多,感谢您细心看完,祝您生活愉快!最后许愿二面!许愿Offer!!任重道远啊,加油!!!

#面经##蚂蚁集团##Java工程师#
全部评论
可以考虑看一看Java的八股文,锁这些内容里面都有,系统地看一下,可能一周就搞定了
点赞 回复
分享
发布于 2021-04-04 08:29
讲的很详细,感谢分享
点赞 回复
分享
发布于 2021-04-04 14:01
联想
校招火热招聘中
官网直投
感谢,十分详细,非常有帮助
点赞 回复
分享
发布于 2021-04-05 17:55
楼主你好,请问你是实习、校招还是社招?
点赞 回复
分享
发布于 2021-04-05 19:50
还原场景,非常用心
点赞 回复
分享
发布于 2021-04-06 18:07
点赞 回复
分享
发布于 2021-04-27 19:08

相关推荐

23 48 评论
分享
牛客网
牛客企业服务