网易面试汇总

项目经历

第一步:先介绍为什么做这个项目,目的是什么?給谁用?解决了用户什么问题?行业背景是什么?
第二步:有哪些模块?主要的业务流程?
第三步:用到哪些技术?
第四步:你负责的那一部分的流程、技术?

注意:最多详细的介绍3个项目,每介绍一个涉及的技术点有哪几点心里亮敞敞的,说出个一二三,最好说的他烧脑。

  1. 抽象类和接口的区别
  2. 抽象类内方法如果全部是抽象的,是不是就是接口?为什么有的类继承一个类后,还要实现多个接口?
  3. 多线程中,线程池用过哪些线程池?
  4. 线程池中所有的参数讲解一下
  5. 线程池中从corePoolSize到maximumPoolSize转变过程,然后一直问我反向转变的操作(多线程并发:就是并发量突然降低了,这个过程怎么实现的,参数如何变化)
  6. HTTP发送请求和接收响应的整个流程;
  7. 403和500状态分别讲解一下,他们之间有什么区别;
  8. 淘宝里如果按照1-5星的店面,从五家店里一共推送出10个同一类产品,都是随机推送,但是最后大量的随机测试后,要保证五颗星的店家推送的商品数量大概是一颗星店家推送的商品数量的五倍,且不能破坏其他概率输出(思维能力:这个问题跟他讨论了有10几分钟,最后他问我有没有优化。。。我哪知道怎么优化)
  9. 一个已知存储了数据的HashMap中如何让所有的键修改成”网易+原来的键”,意思是在所有的key中添加”网易”这个前缀。(Java核心技术:我说迭代处理,但是会有fail-fast问题,然后我就瞎扯了同步操作一下)
  10. spring的AOP原理和底层实现(框架技术:扯了一下概念和反射机制)

  11. Spring的注解讲一下;(框架技术)

  12. 静态代理和动态代理区别讲一下;

  13. 静态代理和适配器设计模式的区别;
  14. tcp和udp的区别;(计算机网络知识:就从可靠性,通讯方式,数据大小,应用方面说了说)

  15. cglib底层实现;(框架技术:懵逼)

  16. 数据库的乐观锁原理和实现;

  17. 数据库索引的设计原理以及意义

  18. 接着上面的问题,问了给定一个数据库,如何设计索引,有什么要注意的?

  19. 给定淘宝秒杀场景,请设计系统实现秒杀(思维能力:又是淘宝,我就说了一下多线程,生产者消费者也扯上去了,他说是多节点实现,其实我没听明白他想让我说啥。。。)

  20. 微博粉丝和关注者,以及用户信息,请实现数据库表,来关联起这些表(数据库:我画图,然后讲了一下,问我有没有优化,我说想不出来)

  21. 针对我设计的表,进行查询操作,问我所有的表查询完后,多少次操作。(数据库)

  22. 之前实习的做了什么项目?讲解一下。

  23. 就着项目,提出海量数据的时候,集合存不下怎么办(Java核心技术:我实在想不到方法,就说了一下把文件进行分割然后再存集合里。)

  24. 数据库里的事务原理讲一下;(数据库:我就扯了一下隔离级别以及脏读,不可重复读以及幻读中事务的问题

  25. 手写jdbc连接数据库的代码(Java核心技术:真心记不得了,只记得流程和类,直接写了一堆注释上去)

  26. 数据库的事务特性有哪些?

  27. 课题讲一下做的什么;

  28. 通信是偏软件还是硬件?为什么学Java(听到这个我就有点崩溃了,依据我的直觉,gg了)(职业发展规划) 最后问我有什么要问的?(提问环节:我真想问问他是不是搞数据库的,大部分都是数据库,虐死。。最后就问了两个小问题,让我回到前台那边等通知

  29. 准备 9大排序,3大查找

  30. 时间复杂度和空间复杂度

    1. 32.
  31. java的多线程、IO操作、集合框架

    1. HashMap和TreeMap

    1. 集合框架
  32. I/O流操作的。给出了四种情况,然后使用I/O流体系内提供的类写出正确的实现组合。题目提供了很多操作流的类,我不一一写出了,附上一张网上找的图片。
    实现序列化接口Serialize的时候,如果不指定serialVersionUID 的值,编译时就会出现警告,为什么?什么情况下需要修改serialVersionUID 的值?

一个系统有多个定时任务,设计一种数据结构用来存储这些任务。考虑定时任务的添加、删除和触发。有10000个任务的时候,分析这种数据结构的性能。(大概是这样的意思)。

java集合框架继承体系(如map接口、Set接口、list接口),答上了
Set的源码与hashMap的源码
java NIO
java并发,如java中的锁有什么
java缓存(接触的少)
java I/O库(用的也少)
mysql中的索引(要详细理解)
最近在学习什么技术
个人感觉知识不要局限在某个方面,要多了解数据库与实际项目的应用及遇到的问题,这点很重要。
开始问Java相关的东西,感觉忘记了很多,也是mysql的索引,hashSet源码,感觉他们似乎对mysql索引,set集合用的很多。
再者用三句话描述下spring框架的原理与作用(相当于向一个不懂spring框架的人介绍spring),近期研究spring基本原理,并没有深入,但作用与原理还是明白的,我回答的是“利用java反射来管理Bean”,应该是正确的,面试官并没有说什么。
如果不让你用Java Jdk提供的工具,你自己实现一个Map,你怎么做。
说了好久,说了HashMap源代码,如果我做,就会借鉴HashMap的原理,说了一通HashMap实现
2、Hash冲突怎么办?
还是HashMap的数组加链表机制
3、HashMap冲突很厉害,最差性能,你会怎么解决
从O(n)提升到log(n)咯,用二叉排序树的思路说了一通
4、你的项目用的什么结构,为什么这么用,主要考虑解决什么问题?
以为又要说道项目,性能什么的,心里一紧。说吧。哼。然后用笔画了系统架构草图,主要从可扩展性、及安全性两方面说了一通。
5、你对mysql熟悉吗?说说mysql索引如何建立的
从b树说到b-树,然后重点说了b+树,画了草图。让面试官觉得自己知道挺多的样子,其实我们这些菜鸟面对这些大牛,哎,真的什么都不算哦
6、 对IO了解吗?String 编码UTF-8 和GBK的区别
当然说了解,基本功好伐。什么字节流、字符流、各种接口实现类。方法阻塞……
7、 什么时候使用字节流、什么时候使用字符流
根据自己现在写的《一卡通小额支付借口》ISO8583报文随便聊了下,答的很不好。
8、了解设计模式吗?
说了一堆:单例、工厂、观察者、适配器、门面……
9、适配器模式的类图知道吗?
(哎,这个忘记了)回答的是:不记得,按照我现在对适配器模式的理解,类图应该这样这样……(又来了一个草图,感觉自己真的是厚颜无耻啊,在大牛面前不懂还装B)
10、JVM有了解吗,可以说说吗?
自己从classload 加载方式,加载机制说开去,从程序运行时数据区,讲到内存分配,讲到String常量池,讲到JVM垃圾回收机制,算法,hotspot。反正就是各种扩展
11、你觉得你还有哪里比较擅长,在这次面试中没有聊起来的吗?
这 这这,我心里想,在你这大牛面前,怎敢提擅长两个字啊。然后弱弱的说了一句“SSH框架都有用过”——这下好了,把SSH技术原理都说了一通。 Struts2的原理体系架构啊,IoC啊,过滤器啊,拦截器啊。Hibernate的原理体系架构啊,五大核心接口啊,Hibernate对象的三种状 态转换啊。Spring的IoC、AOP啊,事务管理啊。
39. 分钟。
40. 1、 简单自我介绍一下
41. (干嘛又是介绍)从本科 到 研究生 学校、专业、保送、什么什么的(所有的自我介绍全部没有说自己的获奖情况啊什么的)
42. 2、 说说项目情况
43. (哎,又是项目)重点强调了一下项目基本都在线上运行,目前正在开发的项目,担任任项目经理(虽然团队很小)
44. 3、 你这个项目(特指正在开发的这个)从需求分析调研到编码的一个过程是什么样子的?
45. 木有需求调研,需求是部门经理已经和客户聊好的。编码就是系统搭建、考虑可扩展性、安全性,再详细我也没说了。
46. 4、 你是从哪里了解到我们公司招聘信息的?
47. (从这里开始要引入室友和阿里巴巴offer的故事了)从牛客网上跟进链接的,很大程度上是因为室友提前参加阿里巴巴内推面试,自己才开始重视起来。但是还是因为自己没写过简历,瘪了好久错过了阿里内推简历投递窗口(当然不是这样直接说的咯,简单的修饰了一下,不过思路是这样的)。因为提到了阿里接下来就问:
48. 5、 你室友参加了我们的招聘吗?说说你对阿里和网易的公司文化和产品的理解吧。
49. 从阿里文化和产品,网易文化和产品说开去。。。。(在我印象中,这是在我讲完后唯一被面试官直接用语言认同了的,她的回复是:“恩,你说的这几点挺对的”)。
50. 6、 你觉得你更喜欢哪一种工作环境。
51. 当然是网易啊,当然也不能说阿里不好咯,互联网的半壁江山可都是阿里的啊。
52. 所以主要是从自己的性格去说的。。。。
53. 7、 你的性格挺适合做项目经理或者产品经理的,为什么你会投一个Java后台开发岗位?
54. (这个被问的稀里糊涂的,在我的理解中,项目经理、产品经理不是要先做程序员的么?不懂啊~,还是装懂,回答了下)从自己性格说道自己性格比较内向啦,喜欢驾驭完全按照自己意志执行的电脑啦,一台电脑就是天下啦(bug除外啊,哈哈哈),和人沟通比较困难啦,什么什么的。
8、如果公司有个刺头,比较不能和人沟通,你会怎么相处
55. 这个好像说了句“如果持续存在意见相左,我会尊重他的想法,但同时也会保留自己的意见,选择包容,因为每个人都有每个人的想法,没有人会按照你的想法生活,我想我对我自己这一点包容还是很自信的”。(接下来重点来了啊)
56. 9、 你期望的薪资是多少?
57. (这个我会贸贸然的说吗?哈哈,太小瞧我了)从自己是个毕业生,没有获得过其他公司的offer,对自己的能力进行评级说起(语气重点说了下,网易是我投的第一份简历,第一家公司啊,这个当然是真的咯,我会乱说?),然后再说自己的能力没有参考标准(开始要引出室友牛逼哄哄的阿里offer了)没办法给出一个具体的数字。然后就开始说:室友了解到的阿里去年薪资水平啊,自己和室友能力大致的比较啊(HR问了我对阿里薪资的了解,才说道这里。其实潜台词是,给我20W+吧,如果可以的话。哎,脸皮真厚,只是说的比较委婉)。
58. PS:天哪里晓得阿里今年是降薪不是加薪,室友心都伤透了,可是还是待阿里如初恋啊。这个是面试结束返回学校之后才知道的啦
HR:这个薪资网易提供的也差不多,不过我们每个月可能发不了这么多,但是我们比阿里发的月数要多。谁还关心月薪啊,重点是自己一年能拿到多少钱。。。然后巴拉巴拉的说了一通阿里和网易的对比。
HR:你有什么要问我的吗?
“如果有幸被贵公司录用,我想了解一下贵公司对应届生的学习环境及员工晋升通道是什么样的?”(问的是不是好有逼格,我是觉得挺有逼格的,我是一个爱学习,有上进心的90后啦)
HR:开始介绍学习啊,评级啊P3-P5啊,股权啊,然后顺便和阿里进行一通对比啊。
好啦,面试正式结束。
拿起手机,拨号,嘟……嘟……嘟……
我:寳寳,面试结束了
BB:棒棒哒~
……
……
……
PS:女朋友陪我一起去杭州参加的现场面。其中有个小插曲:刚来杭州滨江,不熟悉,误入阿里大门,被门卫拦下,没有工作证,被赶了出来。原来网易就在隔壁,之后女朋友死活不去网易大门口,在外面爆嗮了一下午,回校黑了一圈,差点脱皮,心疼死了。滨江这个地方,应该是新开发的吧,周围啥也没有看到。其实网易也要出示工作证的啦,我有面试邮件通知,放行。
来几张现场照收尾
作者:yibeitang
链接:https://www.nowcoder.com/discuss/2821
来源:牛客网
先总结: 个人研究生生涯投出的第一份简历、第一个电面、第一个现场面。。。。。所有的,都是第一次。从8.12号投简历到9.3拿到offer,前前后后, 一共只花了20天的时间,不得不说网易的内推效率就是高(室友拿到了阿里的offer,那时间长的啊。 因为 自己简历憋不出来, 内推不积极, 错过了阿里内推投简历的机会。)。回想一下,一切都很顺利,运气很好。感谢网易对我的认可!
现在才来写,只是无聊,一开始没打算记录什么,只因女朋友又生我气了(哎,我是个SB),一个人呆在实验室,好难受。没啥事可干,本来想敲会代码的,实在没情绪啊!好吧,开始进入主题:

一、电面(电面一共17分钟,之所以印象深刻,是挂掉电话就看了一下时间,当时看到时间就感觉没戏了,怎么才说这么点时间,室友的一面可是一个多小时啊,这回完蛋了)。
1、自我介绍(这个一般都少不了吧)
说了一下自己是XXX学校XXX学院XXX专业的研究生咯,巴拉巴拉……
2、重点介绍一下项目情况
我自己在简历上写了五个项目,3个 已 在线运行的,一个半科研半项目的不伦不类未成形的,一个正在开发当中的电商网站。然后逐个介绍咯!貌似这里就花了我10 分钟的时间(其实绝大多数时间都是自己在巴拉巴拉说个不停,面试官一直在“嗯,嗯,嗯”的回应,估计只是告诉我他在听)。
3、说说你知道的几个Java集合类
自己说了一堆,从list、set、queue、map实现类咯。。。
4、描述一下ArrayList和LinkedList的区别
挺简单的吧
5、实现多线程有几种方式,多线程同步怎么做,说说几个线程里常用的方法
最后一个没回答就这么过了,当时估计脑子短路,没听懂他在说什么
6、说说mysql的索引,索引如何建立
就是b+树咯
7、Spring用的怎么样,看过源码吗?
(源码还真没看过)
8 、了解AOP吗?说说AOP原理,Spring如何实现AOP的
Spring两大核心咯IoC、AOP 这个还是要会的吧
电面现在貌似就只想的起来这么几个问题。

二、现场面(现场面一共分了3面,2个技术面,1个HR面)
面试环境挺好,一对一,一开始以为自己会像电面时紧张的说话都打哆嗦(电面全程打哆嗦说完的,也不只怎么的,就是慌)。坐下来后面对面的开始聊技术,整个过程一点都不紧张。自我感觉一次比一次聊的开,一次比一次聊的满意。PS:每面一次,会刷掉一小波人,如果没有通过一轮面试,大概两分钟后,引导员就会喊你 的名字,告诉你一句:”你好,你今天的面试已经结束了,你可以回家了。“(别问我怎么知道的,一面面完,大家都在等下一步通知时,闲聊知道的)

一、技术面
全部以自己写的项目为主,重点谈性能优化,性能瓶颈,这个自我感觉最不好了,自己写的小屁项目,哪有性能测试,压力测试,大面积并发啊大概30-40分钟左右吧
1、先简单介绍一下你的项目吧
本来打算继续按照电面的时候一个一个按照简历上的顺序讲的,刚开始讲两句,就被打断说面试时间不多,挑两个讲。讲完项目的大致情况,真正是才刚开始啊,然后就被问的各种懵逼啊,现在想想,挺佩服自己能扯的。
2、你的项目中使用过缓存机制吗?又没用用户非本地缓存
用过缓存,但是没用过非本地 独立 缓存啊。然后就开始了一路扯淡的过程
3、”项目“(我自己写的项目)有没有考虑过大面积并发的情况
我的回答是没有,
4、然后他就接下来问:”如果出现大面积并发,在不增加服务器的基础上,如何解决服务器响应不及时问题“。
开始性能调优了。
5、假如你的项目出现性能瓶颈了,你觉得可能会是哪些方面,怎么解决问题。
首先想到的是 自己的项目系统架构支持可扩展, 增加服务器
然后优化代码咯,试试内存泄露啊什么,然后开始坎java的 强 引用、软引用、弱引用什么
接着说了下可能会因为同步粒度大什么之类的。。。。这个真心不怎么会啊
6、如何查找 造成 性能瓶颈出现的位置,是哪个位置照成性能瓶颈。
现在都忘记当时怎么回答了,就大致记得沿着loadrunner说了一通
(插一句,其中还聊到自己的一个穿戴式设备项目,自己又巴拉巴拉说了一通。面试官说一句:”这个不是Java的项目吧“;我说:”是的,是用单片机C写的“。面试官脸都不高兴了,哈哈哈。。。。。)

1、项目结构。
没有缓和的时间,面试官直接问我简历上某个项目的情况,简要的说了下算是缓解心情,问了下使用的相关的技术,比如用了spring mvc框架没 数据库是用的什么 这些可能就是面试官给的缓和时间吧,但是,我是这样越缓和越紧张了,悲催。。。
2、用过mybatis没?因为没怎么用过,所以面试官就没怎么问了。。。
3、集合框架hashtable、hashmap、list、list初始化大小、hashmap自动增长
答:一开始是直接问了解常用的集合框架么,这个一听到肯定说了解咯,于是就让说说hashtable、hashmap、list的区别,所以就大致展开说了下:
ArrayList和Vector的区别:
共同点:这两个类都实现了List接口(List接口继承了Collection接口),他们都是有序集合,即存储在这两个集合中的元素的位置都是有顺序的,相当于一种动态的数组,我们以后可以按位置索引号取出某个元素,并且其中的数据是允许重复的,这是与HashSet之类的集合的最大不同处,HashSet之类的集合不可以按索引号去检索其中的元素,也不允许有重复的元素。
接着说ArrayList与Vector的区别,这主要包括两个方面:.
同步性:Vector是线程安全的,也就是说是它的方法之间是线程同步的,而ArrayList是线程序不安全的,它的方法之间是线程不同步的。如果只有一个线程会访问到集合,那最好是使用ArrayList,因为它不考虑线程安全,效率会高些;如果有多个线程会访问到集合,那最好是使用Vector,因为不需要我们自己再去考虑和编写线程安全的代码。
注意:这里谈到线程安全,同步问题,面试官少不了会多嘴说一句,让你讲讲线程安全是咋回事,如果不考虑,你听到这个问题估计会是一脸懵逼,我当初就是这样子的!所以这里我补充下线程安全的问题: java中的线程安全就是线程同步的意思,就是当一个程序对一个线程安全的方法或者变量进行访问的时候,其他的程序不能再对他进行操作了,必须等到这次访问结束以后才能对这个线程安全的方法进行访问,否则将会造成错误发生;线程安全就是说,如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。 线程安全问题都是由全局变量及静态变量引起的,定义在方法内部的局部私有变量是没有线程安全与否一说的。
备注:对于Vector&ArrayList、Hashtable&HashMap,要记住线程安全的问题,记住Vector与Hashtable是旧的,是java一诞生就提供了的,它们是线程安全的,ArrayList与HashMap是java2时才提供的,它们是线程不安全的。所以,我们讲课时先讲老的。
数据增长:ArrayList与Vector都有一个初始的容量大小,当存储进它们里面的元素的个数超过了容量时,就需要增加ArrayList与Vector的存储空间,每次要增加存储空间时,不是只增加一个存储单元,而是增加多个存储单元,每次增加的存储单元的个数在内存空间利用与程序效率之间要取得一定的平衡。Vector默认增长为原来两倍,而ArrayList的增长策略在文档中没有明确规定(从源代码看到的是增长为原来的1.5倍)。ArrayList与Vector都可以设置初始的空间大小,Vector还可以设置增长的空间大小,而ArrayList没有提供设置增长空间的方法。
总结:即Vector增长原来的一倍,ArrayList增加原来的0.5倍。 PS:因为在上面讲区别的时候提到了自动增长的问题,所以面试官顺带问了句,hashmap自动增长为多少,这个问题说实话,自己没有关注过,平时也没注意过,所以只能老实的说不知道咯,面后网上查了下,不确定是否正确,有说1.6版本的是增长2倍!
ArrayList,Vector, LinkedList的存储性能和特性:
ArrayList和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,Vector由于使用了synchronized方法(线程安全),通常性能上较ArrayList差,而LinkedList使用双向链表实现存储,按序号索引数据需要进行前向或后向遍历,但是插入数据时只需要记录本项的前后项即可,所以插入速度较快。LinkedList也是线程不安全的,LinkedList提供了一些方法,使得LinkedList可以被当作堆栈和队列来使用。
List和Map的区别:
一个是存储单列数据的集合,另一个是存储键和值这样的双列数据的集合,List中存储的数据是有顺序,并且允许重复;Map中存储的数据是没有顺序的,其键(key)是不能重复的,它的值(value)是可以有重复的,存值采用 put(key,value)。Map中取值:value=m.get(key)(这个面试官常问,虽然不难,但也得注意)
HashMap和Hashtable的区别:
HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。因为contains方法容易让人引起误解。
一.历史原因:Hashtable是基于陈旧的Dictionary类的,HashMap是Java 1.2引进的Map接口的一个实现
二.同步性:Hashtable是线程安全的,也就是说是同步的,而HashMap是线程序不安全的,不是同步的
三.值:只有HashMap可以让你将空值作为一个表的条目的key或value,即HashMap允许将null作为一个entry的key或者value,而Hashtable不允许。
PS:最后面试官有问到list初始化大小为多少,也就是说默认是多少,这个其实问的是 List list = new ArrayList() 这里初始化 数组的大小是多少,根据源码我们知道,默认大小为10.
4、多线程 wait()sleep()
答:聊到多线程,大致先问了多线程的实现方式,这个问题不用多说,很简单,java提供了两种方式,一个是继承Thread类,另一个是实现Runnable接口,由于java不支持多继承,所以在多继承的时候,我们得优先选用 实现 Runnable接口,因为我们可以通过实现接口的办法,间接的实现多继承!【问了实现方式之后面试官又问了这两种方法的使用】,其次问到了wait()和sleep()的区别,这两个方法区别在于:sleep()是Thread类的,而wait()是Object类的,sleep是睡眠,指定时间后线程会继续执行,不放弃对cpu资源的占用(即不放弃对象锁),相当于暂停指定t,wait()是等待,需要唤醒,它会释放对cpu资源的占用(即会放弃对象锁),调用notify()和notifyAll()唤醒。
5、spring mvc框架结构 spring过滤器、登录过滤 spring mvc分层 spring注解
答:首先问到的是spring mvc框架,让我讲下其组成及功能,由于当时思路有点凌乱,我主动提出这个问题留到最后讲!接下来面试官问了,spring过滤器,就简单问了下我一般用过滤器做什么,我回答一般处理字符以及编码,显然这不是面试官要的结果,于是面试官提示,加入你在做一个登陆注册系统,怎么用过滤器来验证是否匹配,我直接脱口而出查数据库啦,说完后自己都笑了,至于最后要问的是什么这里我好想也忘了,好想提到什么controller 我说是的,然后应该没答错了,接下来就问到了spring的注解问题,说自己常用的注解有哪些,这里我大致讲了一些,总结摘录如下:
Spring自带依赖注入注解
1 @Required:依赖检查;
2 @Autowired:自动装配2 自动装配,用于替代基于XML配置的自动装配 基于@Autowired的自动装配,默认是根据类型注入,可以用于构造器、字段、方法注入
3 @Value:注入SpEL表达式 用于注入SpEL表达式,可以放置在字段方法或参数上
@Value(value = “SpEL表达式”)
@Value(value = “#{message}”)
4 @Qualifier:限定描述符,用于细粒度选择候选者
@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者
@Qualifier(value = “限定标识符”)
JSR-250注解
1 @Resource:自动装配,默认根据类型装配,如果指定name属性将根据名字装配,可以使用如下方式来指定
@Resource(name = “标识符”)
字段或setter方法
2 @PostConstruct和PreDestroy:通过注解指定初始化和销毁方法定义
JSR-330注解
1 @Inject:等价于默认的@Autowired,只是没有required属性
2 @Named:指定Bean名字,对应于Spring自带@Qualifier中的缺省的根据Bean名字注入情况
3 @Qualifier:只对应于Spring自带@Qualifier中的扩展@Qualifier限定描述符注解,即只能扩展使用,没有value属性
JPA注解
@PersistenceContext
@PersistenceUnit用于注入EntityManagerFactory和EntityManager
具体这里不详细展开,大家可以参考一些专门针对注解的文章!
好了,接下来就提到spring mvc的分层了,总结如下:
使用Java spring进行MVC模式开发时,往往将数据模型分为两部分,即DAO(Data Access Object,数据访问对象)和Service(业务逻辑模型)。在第2步中,控制器向模型请求数据时,并不是直接向DAO请求数据,而是通过Service向DAO请求数据。这样做的好处是,可以将业务逻辑与数据库访问独立开,为将来系统更换数据保存介质(如目前系统使用文件系统存储数据,将来可以更换为使用数据库存储,又或者是现在使用了MSSQL存储数据,将来更换为MySQL等)提供了很大的灵活性。控制器只需要调用Service接口中的方法获取或是处理数据,Service层对控制器传入的数据进行业务逻辑处理封装后,传给DAO层,由DAO层负责将处理后的数据写入数据库中。在Service层使用了抽象工厂模式来实现Service层与DAO层的低耦合,Service层并不知道DAO层是如何实现的,实际上也不需要知道系统使用了哪种数据库或是文件系统。
action(控制器)、Dao(数据访问层)、Service(业务逻辑)!view层(视图 jsp之类的)!
最后就得言归正传了,回到spring mvc框架的结构上来,大概是照着下面总结的:
核心容器 核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开。
Spring 上下文 Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。
Spring AOP 通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
Spring DAO JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。
Spring ORM Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
Spring Web 模块 Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
Spring MVC 框架 MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
Spring 框架的功能可以用在任何 J2EE 服务器中,大多数功能也适用于不受管理的环境。Spring 的核心要点是:支持不绑定到特定 J2EE 服务的可重用业务和数据访问对象。毫无疑问,这样的对象可以在不同 J2EE 环境 (Web 或 EJB)、独立应用程序、测试环境之间重用。
PS:题外要知道的:SpringMVC工作流程描述
1. 向服务器发送HTTP请求,请求被前端控制器 DispatcherServlet 捕获。
2. DispatcherServlet 根据 -servlet.xml 中的配置对请求的URL进行解析,得到请求资源标识符(URI)。 然后根据该URI,调用 HandlerMapping 获得该Handler配置的所有相关的对象(包括Handler对象以及Handler对象对应的拦截器),最后以 HandlerExecutionChain 对象的形式返回。
3. DispatcherServlet 根据获得的Handler,选择一个合适的 HandlerAdapter。(附注:如果成功获得HandlerAdapter后,此时将开始执行拦截器的preHandler(…)方法)。
4. 提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:
5. HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息。
6. 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等。
7. 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等。
数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中。
8. Handler(Controller)执行完成后,向 DispatcherServlet 返回一个 ModelAndView 对象;
9. 根据返回的ModelAndView,选择一个适合的 ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet。
10. ViewResolver 结合Model和View,来渲染视图。
11. 视图负责将渲染结果返回给客户端。
6、连表查询方法、笛卡尔积通过什么连接得到 sql对‘a’,‘b’,‘c’,‘d’排序,排成自己指定的顺序
答:连表查询方法,我大致说了三个,引入之前的答案:说句实在话,自从辞职读研以来很久没有用过sql语句了,关于这几个连接光靠记忆的话,完全会是懵逼,幸亏自己还不算蠢,很自然的根据字面理解,我很好的回答了出来,left join就是返回包括左表中所有记录和右表中联结字段相等的记录,好了面试官会问你,那么如果A表中,有甲丙丁3条记录,B表中有甲乙丙丁4条记录,那么如果条件都满足的情况,A left join B 丙记录是否会被查出,答案是否定的!好了,right join就是和left join 相反的,inner join等值联结 只返回2表中联结字段相等的行!讲到这里我就戛然而止,可能是面试官觉得我回答的还不够全面,所以又提醒我那么笛卡尔积怎么实现的,我想了想,突然脑子中冒出了个Cross join,于是脱口而出,交叉连接,然后面试官嗯了下,于是接着往下走问我一般用什么排序,我就回答,order by啦,然后就是提了下 desc 和ASC的含义,一个降序一个升序没什么好说的,最后话锋一转,问我,给我 a b c d 四个字符让我按照自定义的方式排序怎么实现,比如排序成 b a c d 我实话实说不知道。。。
7、分布式
最后一个问题是问我了解分布式不,我说稍微看了下,不怎么了解,这段时间正打算看看。。。
PS:spring mvc模块及功能是最后回答的,所以回答完这些,面试官让我自己提了些问题,随便问了些,就是后悔没用问我那几个没答出来的题目,本来是要问的,最后竟然忘了!。。。。

你可能感兴趣的:(面试相关)