如何根据894ee以前的入口,来暴雪战网无法找到入口wwW894eecom目前的接入点

404 Not Found
404 Not Found
The requested URL was not found on this server.
您要找的内容已被删除404 Not Found
404 Not Found
The requested URL was not found on this server.
您要找的内容已被删除&p&你非要我推荐,那我帮你搜好了。&/p&&ul&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/liyifeng1994/ssm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&手把手教你整合最优雅SSM框架:SpringMVC + Spring + MyBatis&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/LiuJishuai/ssm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&简易博客系统&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/FuZhucheng/SSM& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SSM框架构建积分系统和基本商品检索系统&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/igaozp/SSM& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Spring + Spring MVC + Mybatis 构建的简易论坛&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/search%3Fp%3D2%26q%3Dssm%26type%3DRepositories%26utf8%3D%25E2%259C%2593& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&更多项目&/a&&/li&&/ul&
你非要我推荐,那我帮你搜好了。
&p&别光收藏啊亲,点个赞吧!&/p&&figure&&img src=&https://pic1.zhimg.com/v2-ae6cc22e894cd738f3d58_b.png& data-rawwidth=&482& data-rawheight=&94& class=&origin_image zh-lightbox-thumb& width=&482& data-original=&https://pic1.zhimg.com/v2-ae6cc22e894cd738f3d58_r.png&&&/figure&&p&&br&&/p&&p&收藏比赞多两倍,你们这样做真的是大丈夫吗TAT。&/p&&p&&a href=&https://www.zhihu.com/zhi/people/097600& class=&internal&&值乎 - 说点儿有用的&/a& (来值乎问我吧)&/p&&p&&b&》》》》》》&/b&&/p&&p&&b&距离发帖到现在(),已经有8位同学发来了感谢信,分别来自阿里巴巴(3人),蚂蚁金服(2人)百度,美团,蘑菇街。都是校招的同学。各位加油 :),我相信会有更多的人从这份答案中获得帮助。&/b&&/p&&p&&b&》》》》》&/b&&/p&&p&&br&&/p&&p&&br&&/p&&p&============================以下正文===================================&/p&&p&很荣幸的今年通过了阿里巴巴的实习生招聘!&/p&&p&我把我看过的书罗列一下吧!&/p&&ul&&li&《java核心技术:卷一》,这个是我入门java的时候看的,非常适合新手!&/li&&li&《java设计模式》这本书虽然是个外国人写的,但是感觉不是很好。评价一般。学习设计模式的时候我一般都看大牛的博客。&/li&&li&《深入理解jvm虚拟机》 这本书不用多说,业界非常非常好的一本书!多看几遍,每一遍都有很多收获 &/li&&li&《深入分析java web 技术内幕》 &a class=&member_mention& href=&//www.zhihu.com/people/1a2988ddbcba60b97bb2579e& data-hash=&1a2988ddbcba60b97bb2579e& data-hovercard=&p$b$1a2988ddbcba60b97bb2579e&&@君山&/a& 山哥,竟然还能@你出来!(不得不说,这本说在各个方面都非常优秀,不愧是偶像写的书!还求山哥多多照顾。嘿嘿&/li&&li&《Spring技术内幕》在spring源码讲解方面,个人感觉非常不错。能够深入理解内部机制,但是需要多看几遍&/li&&li&《编程之美》业界翘楚,在算法方面终结的非常好,题目也非常有代表性&/li&&li&《剑指offer》不用多说,和上面一样,可以锻炼一些算法能力&/li&&li&《java编程思想》传说是java行业内的神书,但是目前表示还处于一知半解状态&/li&&li&《Hadoop技术内幕》这个可以pass掉,学习hadoop的时候看的&/li&&li&《TCP/IP详解,卷一:协议》可以对tcp有更加深刻的认识&/li&&li&《java网络编程》,不是很好,将就可以。学学api还是可以的&/li&&li&《大型网站技术架构》 &a class=&member_mention& href=&//www.zhihu.com/people/bd5d5dc0b0& data-hash=&bd5d5dc0b0& data-hovercard=&p$b$bd5d5dc0b0&&@李智慧&/a&
在大型web架构方方面面简直膜拜,&/li&&li&------------------今天又想起一些------------------------&/li&&li&《分布式java应用:基础与实践》这个是毕玄大大写的书,非常不错哦&/li&&li&《how tomcat works》在讲解tomcat内部原理方面,个人觉得是非常不错的书!等级又要上升一个档次&/li&&li&《java并发编程实战》对java并发方面,讲得还算不错的书籍&/li&&li&当然还有一些杂七杂八的书(走了不少弯路,你懂的!),我就不列出来了,上诉都是笔者认为非常不错的书籍。&/li&&/ul&&p&最近正在看《算法导论》,和《算法》,md,其实我也想成为算法狗&/p&&figure&&img src=&https://pic2.zhimg.com/487ef0ff429c5e40b37d4d_b.jpg& data-rawwidth=&105& data-rawheight=&107& class=&content_image& width=&105&&&/figure&&p&&br&&/p&&p&当然,上面这些书我表示只懂50%,惭愧。不能完全吸收大牛的精髓啊!&/p&&ol&&li&其他的,数据结构,计算机网络,操作系统,数据库都是平时学习的课本,数据库做项目的时候实践一下!先学习基础,在继续深入&br&&/li&&/ol&&ul&&li&数据结构不用多说,什么B树啊、红黑树啊、栈、队列等等,至少保证能够清楚的说出来,说出他们的原理!具体的应用场景是什么啊!,当然能写出来更好(手写btree会死人,其实还有一个数据结构叫skiplist,逃&br&&/li&&li&算法的话,建议题目多看看算法题目,或者把leetcode上的算法题目刷一遍(目前本人只AC的几道题,惭愧。知道该资源的时候已经晚了,现在在努力刷刷刷)。另外可以看看july的博客,&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/v_JULY_v& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&结构之法 算法之道&/a&。目前july已经有自己的网站了,&a href=&//link.zhihu.com/?target=http%3A//ask.julyedu.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&七月问答 ─ 面试·算法·机器学习快速问答平台&/a& .本人是july的忠实粉丝,在此感谢 &a class=&member_mention& href=&//www.zhihu.com/people/2f780d2804bcea34d94a7f& data-hash=&2f780d2804bcea34d94a7f& data-hovercard=&p$b$2f780d2804bcea34d94a7f&&@July&/a& ,对我在算法方面有很大的帮助,谢谢&/li&&li&数据库就更多了,索引(结合B+tree,两个引擎的不同之处,推荐文章:&a href=&//link.zhihu.com/?target=http%3A//blog.jobbole.com/24006/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&MySQL索引背后的数据结构及算法原理&/a&)、存储过程、引擎、触发器,事务 &a class=&member_mention& href=&//www.zhihu.com/people/d3a7e63ab4adffd7cd9de& data-hash=&d3a7e63ab4adffd7cd9de& data-hovercard=&p$b$d3a7e63ab4adffd7cd9de&&@沈询&/a&
实力打广告,还有沈大大的视频和博客(&a href=&//link.zhihu.com/?target=http%3A//weibo.com/whisperxd& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&weibo.com/whisperxd&/span&&span class=&invisible&&&/span&&/a&)微博里面有链接哦,ACID等等等等,SQL必须是要熟练的,写SQL的时候多考虑考虑效率,想想还有没有其他的语句能完成这个任务,在哪方面提高了,为何呢?数据库引擎要了解一下,分布式数据库也是,什么主从分离啊,分库、分表、分区啊,这些常见的解决方案&br&&/li&&li&操作系统我属于渣渣,个人就知道一些进程、线程、一些调度算法之类的~~~~(逃&/li&&li&计算机网络如果是研发岗位得话,TCP/IP这一张需要好好看看,HTTP协议不用多说,常见的状态码等等,一次http请求有哪些过程,这个要理解透彻&/li&&/ul&&p&java:基础非常重要,当然也要深入理解原理,什么JVM,JMM,Classloader,还有一些常见类的源码,自己可以试着分析一遍,现在让你说出LinkedList的内部实现你能不能说出来,HashMap不用多说了,80%的面试都会问到。还有重要的,多线程,并发,网络,IO。这些都是要看看看看的!自己多思考!还有楼主说的那些框架,说实话,你要是基础好了,这些都是能够学得很快的,很多问题,看一下源码什么都就懂了!特别是spring的源码要好好看看,里面的架构设计得非常好!各种设计模式满天飞!&/p&&p&另外,linux要了解一下,至少要回基本命令吧,脚本语言可以学习一个。比如py!前端要了解一下.&/p&&p&&br&&/p&&p&关于如何看书:两个字,&b&思考&/b&!三个字,&b&不要脸的思考!…………,书不在多,在于精,选书要慎重!反正题主一本叫做“王者归来”的书,我看见名字我就不想看!&/b&&/p&&p&除了这些然后呢:每天刷几遍CSDN,&b&平常可以上上oj刷刷题目,国内的牛客网(&a href=&//link.zhihu.com/?target=http%3A//www.nowcoder.com& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&牛客网-专业IT笔试面试备考平台,最全求职题库,全面提升IT编程能力&/a&)非常不错,也可以去leetcode上面把题目刷一遍哦。&/b&关注一些好的社区(我一般混迹在CSDN高性能javaweb板块),睡觉之前看微信公众号,当然是技术方面的!推送的文章都挺不错的!&/p&&p&做程序员个人觉得眼界很重要,就算这不是你的领域,但是你也要知道一点,所以经常关注其他的新技术是非常重要的!平常多接触一点开源技术,多上上github,争取能在github上面贡献一点自己的东西!&/p&&p&&br&&/p&&p&然后,多看看别人的技术博客。思考自己!&/p&&p&&b&这是我学习路程的经验和一些资料总结,大家可以看看,链接——&&a href=&//link.zhihu.com/?target=http%3A//yaccc.0xff.ws//%25E6%258A%%259C%25AF%25E6%E5%25AD%2597/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&技术文字 | 「浮生若梦」&/a&可以再评论箱中评论,我会一一回复(下面贴一部分)&/b&&/p&&p&&b&我的经验与分享&/b&&/p&&p&关于我的学习方法和面试经验的分享&/p&&blockquote&下面是我写给我现在带的学弟在学习路线上的一些建议,大家可以参考一下!希望能够帮助到大家,有写得不太合适的地方,&b&还请大家指正&/b&!&/blockquote&&p&一、基础&/p&&ul&&li&主要看《java核心技术:卷一》的重点章节&/li&&li&掌握java常用技术,io、多线程、反射、常用集合框架&/li&&li&数据结构看一遍,作用至少要清楚。如hash冲突解决办法,常用排序算法的应用场景和空间/时间复杂度等&/li&&li&数据库,能看懂ER关系,熟悉数据库三大范式,熟练常用SQL语句&/li&&li&可以掌握一点java网络编程方面的知识,对tcp/ip有初步的认识&/li&&li&课程不能落下,专业课程(计算机网络,操作系统,数据结构,数据库,计算机组成原理)要好好学。&b&不要挂科&/b&&/li&&li&学习servlet/jsp,至少能写简单的图书管理系统,熟悉核心api&/li&&li&了解前后端交互方式,ajax、json/xml至少知道,会使用jquery,html,css,js最好&/li&&/ul&&p&二、提高&/p&&ul&&li&学习后端框架,SpringMVC/Struts2、Mybatis、Spring,熟悉MVC模式,知道三层架构及每一层之间的关系&/li&&li&会用chrome/firefox浏览器分析http请求,解决、定位问题。知道常用http状态码,了解TCP/IP,知道一次http请求发生了哪些事情&/li&&li&学习设计模式,23种设计模式都需要了解一点,熟悉常用的如:单例,工厂,模板,适配器,代理,责任链,构造器,装饰器,迭代器,策略,命令,观察者,外观,享元。理解他们的好处,可以找找在其他框架哪些用了这些设计模式。&/li&&li&可以适当的看一些源码,Spring的源码可以着重的看一下。tomcat可以从源码的角度看看tomcat的整体设计方案,一次请求tomcat如何处理,servlet在tomcat中的加载,编译过程。tomcat自定义的ClassLoader有什么作用。&/li&&li&会设计数据库,多对多,一对多,迭代,会写复杂的SQL,了解SQL调优,会写存储过程,触发器。熟悉索引的使用,了解视图。去了解一些常用NOSQL,比如Redis/mongodb&/li&&li&学习Linux,熟悉基本命令,学习一种脚本语言(shell/python)。会在linux下写脚本开发&/li&&/ul&&p&三、深入&/p&&ul&&li&算法,可以看看编程之美,算法导论。学习一些算法相关的知识&/li&&li&深入java:理解JVM,JMM,Classloader,GC算法,GC收集器。学会定位OOM问题所在。&/li&&li&源码分析,常用集合类如:Hashmap,Arraylist,linkedList,HashSet,ConcurrentHashmap等的源码分析,要非常熟悉java集合框架设计。最好能够分析一种框架源码,比如Spring&/li&&li&深入数据库,理解至少两种数据库引擎(Inndb/Mysiam)的差异性,熟悉索引的内部数据结构,熟悉常见的索引方式(Btree,hash),和索引类型(unique,full text,normal),会使用explain分析SQL语句,会优化SQL语句,熟悉一种NOSQL,知道内部实现原理(内部数据结构,在算法优化,内部机制),掌握分布式数据库的知识,分表,分库,分区,分布式事务等,可以学习一个数据库中间件(TDDL/COBAR)&/li&&li&架构设计,看看大型高流量/高并发的网站设计(CDN,异步,前端优化),了解缓存(分布式memcached/常用本地缓存),搜索引擎(lucene/solr/elasticSearch),分布式(负载均衡/分布式数据库/分布式应用集群),消息队列(ActiveMQ/Rabbitmq)在大型网站中的作用&/li&&li&还有一些其他的知识,如RPC框架,分布式服务架构,SOA,REST架构等等&/li&&li&可以接触一些云计算方面的知识,如Hadoop/Storm/Spark等,要是再能接触一点机器学习就更棒啦(反正我是没有,听着就吓人,跑个kmeans算法都要弄死人,(&i&+﹏+&/i&)逃&br&&/li&&/ul&&blockquote&那么除了看书籍之外还有哪些学习方式呢?下面说说其他的学习方式&/blockquote&&ol&&li&参加开源项目/自己写点东西放在GITHUB上面,笔者我写了一个自己的MVC框架(Dreamvc),github地址-&&a href=&//link.zhihu.com/?target=https%3A//github.com/Yaccc& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Yaccc (Zhaodong Xie) · GitHub&/a&.另外可以去fork下其他人的开源项目,如果感兴趣就贡献一下,不感兴趣就学习别人的编码风格,去其糟粕!&/li&&li&多看看大牛的博客,这里我列举一些&b&大牛&/b&的博客&/li&&/ol&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/v_JULY_v& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&结构之法,算法之道,july大神的博客&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/xieyuooo& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&xieyuooo的专栏,《java特种兵作者》&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//weibo.com/u/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&@兰亭风雨人任平生&/a&|&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/ns_code%3Fviewmode%3Dlist& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&兰亭风雨的专栏, 目前人在腾讯,博客都写得很好,很深入!受益匪浅&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//thinkinginjavablog.sinaapp.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&机会永远留给有准备的人,享受编程和技术所带来的快乐(目前人在VMware)&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/yangbutao%3Fviewmode%3Dlist& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&分布式架构、大数据、机器学习、搜索、推荐、广告&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//irfen.me/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&赵伊凡's Blog,涉及各个领域&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.searchtb.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&搜索技术博客-淘宝,搜索团队的blog&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.liaoxuefeng.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&廖雪峰的官方网站,python就是跟着他学的&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.inbreak.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&空虚浪子心的灵魂,java安全,alibaba的安全专家&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//jm-blog.aliapp.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&阿里中间件团队博客,咱事业部的中间件,很厉害 (???ε ???)&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.ha97.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&服务器运维与网站架构|Linux运维|X研究,里面提到的技术都碉堡,博客质量也高。曾经memcached在哪里学到了很多&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.sina.com.cn/s/blog_693fvibt.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&淘宝沈询_WhisperXD的博客,TDDL作者,ONS消息服务负责人,差点就跟着沈沈混了(o?????o)??° (?? `?) (???ε ???),在数据库方面强烈推荐&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.aminglinux.com/study_v2/index.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&跟阿铭学Linux&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//mindhacks.cn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&刘未鹏 | MIND HACKS,这个大牛简直不要太叼&/a&&/li&&/ul&&p&&br&&/p&&ol&&li&多上一些高质量的网站,下面我列举一些,&b&每天&/b&都最好抽时间去走一遍&/li&&/ol&&ul&&li&&a href=&//link.zhihu.com/?target=https%3A//github.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&GitHub,程序员不知道这个可以考虑转行了(?? `?)&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSDN.中国最大的it交流网站&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.cnblogs.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&cnblogs,还是有很多资料的,里面也有大神&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//stackoverflow.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Stack Overflow,问答网站,回答质量高&/a&&/li&&li&&a href=&//link.zhihu.com/?target=https%3A//leetcode.com/problemset/algorithms/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&LeetCode OJ,刷算法的oj&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.v2ex.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&V2EX,一个关于分享和探索的地方。&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.iteye.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&ITeye,前身为JavaEye。&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//ifeve.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&并发编程网,致力于促进并发编程研究和传播的垂直性技术网站。&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.ibm.com/developerworks/cn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&IBM developerWorks 中国,里面有高质量的文章&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.oschina.net/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&开源中国,可以关注一些开源动态&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//ask.julyedu.com/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&7月算法,july的在线教育项目,主要是算法方面&/a&&/li&&li&&a href=&//link.zhihu.com/?target=http%3A//www.infoq.com/cn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&InfoQ,促进软件开发领域知识与创新的传播&/a&&/li&&/ul&&p&&br&&/p&&ol&&li&关注一些技术类的微信号(晚上睡觉或者平时杂碎时间看)&a href=&http://www.zhihu.com/people/Michael282694& class=&internal&&@Michael282694的知乎&/a&|&a href=&//link.zhihu.com/?target=http%3A//michael282694.com/post/ji-zhu-lei-xiang-guan-wei-xin-gong-zhong-zhang-hao-he-wang-zhan& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&cindy总结的 (???ε ???),这是原地址&/a&&/li&&/ol&&p&&br&&/p&&p&最后送一句话,越努力,越幸运!&/p&&p&&br&&/p&&p&&br&&/p&&p&&br&&/p&&p&要私信我的同学,请先看这篇文章,谢谢!&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&EchoQME只为最好的你 - 谢照东的文章 - 知乎专栏&/a&&/p&&p&&a href=&//link.zhihu.com/?target=http%3A//weixin.qq.com/r/1EX27jrEKGdXrX6N9xDG& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&weixin.qq.com/r/1EX27jr&/span&&span class=&invisible&&EKGdXrX6N9xDG&/span&&span class=&ellipsis&&&/span&&/a& (二维码自动识别)&/p&&p&“十年饮冰 难凉热血”,欢迎关注,推送互联网技术,也许是个自媒体. : )&/p&&p&PS:转载须经本人同意,并支付报酬&/p&
别光收藏啊亲,点个赞吧! 收藏比赞多两倍,你们这样做真的是大丈夫吗TAT。 (来值乎问我吧)》》》》》》距离发帖到现在(),已经有8位同学发来了感谢信,分别来自阿里巴巴(3人),蚂蚁金服(2人)百度,美团,蘑菇街。都是校招的同学。…
&figure&&img src=&https://pic3.zhimg.com/v2-abd7c8934dfd38b0ee0a_b.jpg& data-caption=&& data-rawwidth=&325& data-rawheight=&132& class=&content_image& width=&325&&&/figure&&p&分享一下我的读研经历吧,希望对你有帮助。&/p&&p&2017,我研三,是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金服的实习。八月,又经历了两轮面试,总算拿到转正offer。到此为止,我总算可以尽情地享受最后的校园时光了。 &/p&&h2&我的读研经历&/h2&&p&阿里是我读研阶段的一个重要目标,刚上研一的时候我便立下Flag,计划了读研三年要做的事情、要学的东西。翻翻我的博客,居然还能找到当时写的读研计划(想想时间过的真的好快呀)。阿里在我心中一直是技术者的朝圣地,聚集了一群技术狂热分子,为了提升一点点的性能可以废寝忘食。在立下这个flag后,我便把我要去阿里的想法告诉了身边的所有人。我不想给自己留有后路,既然牛逼吹出去了,那就得落实到行动上。&/p&&p&我当时的计划是这样的,研一玩命做项目,毕竟写代码是一项孰能生巧的技术,多写代码自然能加深对技术的理解。事实也确实证明了这一点。我大四毕业的那个暑假,第一次接触《深入理解JVM虚拟机》,当时看完之后是一脸懵逼的,所有的汉字都认识,但连成一条句子后咋就不明白呢?然后怀着这种一脸懵逼的状态,强行把这本书看完了,但由于理解的不够深刻,很快就忘记了。然后经过一年疯狂做项目,当我再抱起这本书时,我对这本书的感觉有了180度的转变,通俗易懂啊。我怀疑自己当时为什么这么傻。而在这一年之内,我一共做了四个项目。所以说,写代码能潜移默化地提升你对技术的理解程度。&/p&&p&记得我们学校考研结果公布是在三月底,得知我录取了,短暂的高兴了一下,第二天便去了导师实验室,参与到项目中去。因为我心理很清楚,我的目标是阿里。 &br&刚去实验室的时候感觉自己完全是一只小白,师兄们开会讨论的东西我竟然一个字都听不懂,刚开始分到的工作也很难顺利的完成。但我是一个天生不服的人,我越是不懂,我越是要征服。(PS:追女生也一样,当时看上了一个高冷型女神。越是高冷,我越要拿下……省略一万字……最后成功了)。我渐渐跟上了师兄们的步伐,从第二个项目开始,我一直是项目负责人了。 &br&我给自己定的方向是Java,而实验室的项目五花八门,Qt、C++、图像图形……,但我心里清楚,这些项目可以拓宽我的视野,可以锻炼我的学习能力、思维方式,但要深入理解的技术还是Java。所以我利用项目空窗期,看了很多Java方面的书籍,文末我列了一份清单供大家参考。&/p&&p&研一做了一年项目之后,感觉自己解决问题的能力、快速上手新技术的能力有所提升,但做项目一味求快、一味赶时间,我对很多技术的理解仅停留表面。所以更多时候我感觉自己是在搬砖,很难写出高质量的代码。当时我决定,研二的上半学期一定要好好稳固基础,深入理解技术背后的原理,放慢做项目的节奏,不一味地盲目求快。&/p&&p&然而研二我去了一家创业公司实习,被安排做前端。既然我无法选择,那我就拥抱变化。既来之则安之,我希望自己所花的时间都有所收获。所以我全身心投入到工作中去。公司安排我做前端,虽然这并不是我想干的事情,但当前别无选择,既然做那就得做好。我花了一个月的时间怒刷前端知识,学习Angular、React,了解它们的设计思想,学习JS背后的原理,也看到了前端目前的发展状况。前端的技术迭代速度很快,但技术背后的原理都是类似的,所以抓住技术背后的本质才是最重要的。 &br&这段实习一直持续到了今年一月,我心理清楚,二月底三月初阿里的实习招聘就要开始,所以我挤出中午休息时间、晚上下班后的时间、周末的时间,复习我之前积累的东西。&/p&&p&三月三号,人生的第一次面试,在看到杭州的电话时,那一刻的心情既忐忑又兴奋。在此之前,我并不清楚自己的水平在所有应届生中处于一个怎样的层次,在电话接通之前我已经做好了充分的心理准备,想象了各种被面试官吊打的画面。第一次面试持续了54分钟,面试官似乎破有耐心,整个面试过程相谈甚欢。那一次的面试给了我巨大的信心,因为我清楚,我离我的目标更近了一步。 &br&在接下来的一个月中,我陆陆续续接到了五次面试电话,每一次面试都是一次学习的机会,能发现自己的不足,在与面试官交流的过程中也能了解到最新的技术、最佳的实现方法。&/p&&p&四月十四,记得那天刚给本科生上完算法课,晚饭过后便收到的阿里的offer。当时的喜悦之情溢于言表,这么久的努力没有白费。但我心里也清楚,阿里的实习转正率向来很低,要想通过实习留下来也不是一件容易的事。所以在收到阿里offer之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成:拿下阿里转正offer。&/p&&p&5.20,一个美好的日子,我怀着憧憬、忐忑、兴奋的心情走进了支付宝大楼,开始了我三个月的实习生涯。这三个月的实习让我学到了很多,我看到了每天的进步,也看到了自己的不足。这100天经历了太多的事情,有太多的体会,有空我再单独写一篇实习期间的感悟与大家分享。&/p&&p&9.1晚上11点,我的状态从『面试中』变成了『待跟进offer』,我会心一笑,我达成了人生第一阶段的目标。那一刻我没有太多的激动,在经过了2017年8个月的持久作战之后,这个offer早已在我的意料之中。&/p&&p&第二天是周六,这个周末我给自己放了两天的假。虽然在杭州已经呆了102天,虽然支付宝大楼就在西湖边,但每天两点一线的工作,我并没有去过西湖。那一晚我的基友(帅气的天哥,文末附有征婚启示)得知我收到offer后便立即买票,坐了一夜的火车来杭州为我庆祝。也托他的福,在这个周末我第一次游览了这座美丽的城市。&/p&&p&最后的校园时光,我给自己定了一个新的目标,这个目标也许充满了挑战、充满了艰辛与困难,但我想如果能达成,我的人生将会有很大的改变。在人生的路上,我还在奋斗。希望与各位共勉。&/p&&h2&建议:养成写博客的习惯&/h2&&p&在面试阿里的过程中,博客帮了我很大的忙。并不是说有博客在面试中会加分,而是写博客的过程能加深你对知识的理解,而且回顾起来也特别高效(毕竟是自己写的东西)。&/p&&p&我从研一开始便养成了写博客的习惯,现在先过头来,这两年我一共写了185篇文章,有22W的访问量,也很荣幸称为专家博主。我的博客现在已经成为我一笔最宝贵的财富,记录了我技术的整个体系结构,也记录了学习技术的心路历程。&/p&&p&可能很多同学都有写博客的经历,但能长期坚持的少之又少。我想告诉大家,任何事情都贵在坚持。只要坚持21天就能养成习惯。有的时候对这件事缺乏兴趣了很难再持续下去,但想想自己的目标,咬咬牙坚持下去,养成习惯你就赢了。&/p&&p&我的博客一般都是看完一本书后的总结,我会把一本书中最核心的东西,按照我的理解把它们记录下来。每一本书我都会看三遍,第一遍是快速浏览,了解整本书的体系结构、作者的行文思路,知道书中重要的、不重要的内容,也就是要建立起全局观。第二遍我会精读,把那些我认为重要的内容挑选出来着重阅读、反复理解、吃透。第三遍阅读,往往会冒出新的理解,我时常有这种『书读百遍,其义自见』的感觉。三遍读完后,我便按照自己的理解,把核心内容写成博客。由于是自己的写的东西,所以在复习的时候只要花上三五分钟通读一遍,所有的知识点又被唤醒。&/p&&h2&Java体系结构整理&/h2&&ul&&li&Java相关&/li&&ul&&li&Java集合框架&/li&&li&Java并发编程
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(一)——并发编程需要注意的问题&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(二)——重排序&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(三)——volatile&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(四)——线程的状态&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(五)——中断&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(六)——线程间的通信&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(八)——闭锁、同步屏障、信号量详解&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(七)——Executors&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(九)——批量获取多条线程的执行结果&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(十)——线程池(1)&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(十一)——线程池(2)&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(十二)——线程安全&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发编程的艺术(十三)——锁优化&/a&&/li&&/ul&&li&Java并发容器
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java并发容器大合集&/a&&/li&&/ul&&li&Java虚拟机
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解JVM(一)——JVM内存模型&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解JVM(二)——揭开HotSpot对象创建的奥秘&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解JVM(三)——垃圾收集策略详解&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解JVM(四)——对象内存的分配策略&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解JVM(五)——HotSpot垃圾收集器详解&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解JVM(六)——JVM性能调优实战&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解JVM(七)——Class文件结构&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解JVM(八)——类加载的时机&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入理解JVM(九)——类加载的过程&/a&&/li&&/ul&&li&设计模式
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/category/5767333& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&23种设计模式-大闲人柴毛毛的博客&/a&&/li&&/ul&&li&Spring核心思想
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入剖析Spring(一)——IoC的基本概念(从面向对象角度介绍)&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入剖析Spring(二)——IoC容器的实现&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入剖析Spring(三)——Bean的生命周期&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&深入剖析Spring(四)——AOP&/a&&/li&&/ul&&li&面向对象的思想&/li&&li&Java8新特性
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java8新特性——Lambda表达式(一)&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java8新特性——StreamAPI(一)&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Java8新特性——StreamAPI(二)&/a&&/li&&/ul&&/ul&&/ul&&p&&br&&/p&&ul&&li&计算机基础&/li&&ul&&li&算法
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/category/6840444& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据结构与算法-大闲人柴毛毛的博客&/a&&/li&&/ul&&li&数据结构
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&彻底搞懂红黑树&/a&&/li&&/ul&&li&操作系统&/li&&li&计算机网络
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&计算机网络传输层知识点全覆盖&/a&&/li&&/ul&&li&数据库
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据库索引全面解析&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据库事务详解&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&数据库三大范式&/a&&/li&&/ul&&/ul&&/ul&&p&&br&&/p&&ul&&li&Linux
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/category/3112597& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Linux常用指令-大闲人柴毛毛的博客&/a&&/li&&/ul&&li&架构高性能网站
&/li&&ul&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&架构高性能网站秘笈(一)——了解衡量网站性能的指标&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&架构高性能网站秘笈(二)——动态内容缓存&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&架构高性能网站秘笈(三)——浏览器缓存&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&架构高性能网站秘笈(四)——反向代理缓存&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&架构高性能网站秘笈(五)——Web组件分离&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&架构高性能网站秘笈(六)——构建数据缓冲区&/a& &/li&&li&&a href=&//link.zhihu.com/?target=http%3A//blog.csdn.net/u/article/details/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&架构高性能网站秘笈(七)——负载均衡&/a&&/li&&/ul&&/ul&&hr&&h2&我的书单&/h2&&p&先唠叨两句。学好计算机,基础扎实很重要!Github上每17秒就会出现一种新的技术、新的框架,技术迭代的速度远高于我们学习的速度,但这并不可怕,因为技术背后的原理是相通的。所以我们要做的就是抓住技术本质、打牢基础,以不变应万变。附上之前我关于基础学习的回答:&/p&&p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&大闲人柴毛毛:计算机科学与技术专业的学生要怎样做才能避免成为 一个低级的码农?&/a&&/p&&p&&a href=&https://www.zhihu.com/question//answer/& class=&internal&&大闲人柴毛毛:自学编程需要注意什么?&/a&&/p&&p&&br&&/p&&ul&&li&基础类书单&/li&&ul&&li&《Java核心技术》卷一+卷二&/li&&ul&&li&这两本书加起来将近1700页,读完它需要有足够的勇气和耐心。但这就是打基础的阶段,罗胖子说过,学习就是一个使大脑处于非舒适态的过程,学习并不是一件快乐的事情,如果你长期处于舒适状态,或许你自认为每天都在学习,但实际上你一直在原地踏步。所以我觉得这本书至少要通读一遍,就算含着泪也要把它读完。&/li&&li&当然,读1700页的书毕竟是一项浩大的工程,换谁都会心生乏味。所以我觉得读书的方式方法也很重要,可以伴随视频教程一起学习,每读完一章后再看一遍视频,这样一方面起到调节的作用,另一方面在读书过程中遇到的问题也许会在视频学习中迎刃而解,一举两得。&/li&&/ul&&li&《计算机网络》-谢希仁&/li&&ul&&li&这是一本好书!我在读这本书的时候有种强烈的感受,就是每当我有一丝疑惑的时候,我就会在接下来的篇幅中马上找到问题的答案,一环扣一环。这种感觉让我很享受阅读的过程,使得整个阅读过程都伴随着『发现问题-解决问题』的循环,吊足了我的胃口,也就很自然的把一本书一口气看完。也许这就是大师吧。&/li&&/ul&&li&《算法》-Sedgewick&/li&&ul&&li&算法是程序员的基本功,这本书用彩图解释各种算法的原理,通俗易懂、肥而不腻。&/li&&/ul&&/ul&&/ul&&p&&br&&/p&&ul&&li&进阶类书单&/li&&ul&&li&《深入理解Java虚拟机》-周志明&/li&&ul&&li&这本书我一共读了两次,第一次读完全是一头雾水、不知所云;时隔一年,在疯狂做了6个项目之后,再读这本书的时候,我嘲笑一年前的自己:为何当初那么傻。所以建议大家:写代码毕竟是一项熟能生巧的技术活,多多动手、多多思考会在潜移默化中加深你对技术的理解。&/li&&/ul&&li&《构建高性能Web站点》-郭欣&/li&&ul&&li&这本书干货颇多,看完受益匪浅!比较全面地介绍了各种WEB性能优化的手段、它们的使用场景、优缺点对比。是我们这种还在象牙塔中的小白程序员了解外面世界的大门。&/li&&/ul&&li&《Java并发编程实战》-Brian Goetz 和 《Java并发编程的艺术》-方腾飞&/li&&ul&&li&《Java并发编程实战》翻译有些生硬,也许是我水平不够,看的相当费劲,我当时强行看完之后,仍然存在诸多疑惑,所以我又读了《Java并发编程的艺术》,毕竟是咱中国人写的书,很符合咱中国人的思维方式。看完之后解开了先前的很多疑惑。如果你是大神,就直接阅读《Java并发编程实战》英文原版吧。&/li&&/ul&&li&《Java性能优化权威指南》-Charlie Hunt&/li&&li&《Spring实战 第四版》-Craig Walls&/li&&li&《Java TCP/IP Socket编程》-Kenneth L.Calvert&/li&&/ul&&/ul&&figure&&img src=&https://pic2.zhimg.com/v2-d0a17755e5dbca4f840d_b.jpg& data-caption=&& data-rawwidth=&3456& data-rawheight=&4608& class=&origin_image zh-lightbox-thumb& width=&3456& data-original=&https://pic2.zhimg.com/v2-d0a17755e5dbca4f840d_r.jpg&&&/figure&
分享一下我的读研经历吧,希望对你有帮助。2017,我研三,是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金服的实习。八月,又经历了两轮面试,总算拿到转…
&figure&&img src=&https://pic1.zhimg.com/v2-d4bdb5aaf5deacdc165c_b.jpg& data-rawwidth=&1366& data-rawheight=&768& class=&origin_image zh-lightbox-thumb& width=&1366& data-original=&https://pic1.zhimg.com/v2-d4bdb5aaf5deacdc165c_r.jpg&&&/figure&&p&本集概要:&/p&&ul&&li&构造器注入有什么缺点?&/li&&li&如何使用setter注入?&/li&&li&setter注入为什么会导致空指针异常?&/li&&/ul&&p&前情回顾:&a href=&https://zhuanlan.zhihu.com/p/& class=&internal&&用小说的形式讲解Spring(1) —— 为什么需要依赖注入&/a&&/p&&hr&&p&大雄给项目引入了Spring框架,解决了代码过度耦合的问题,当然,这只是Spring强大功力的冰山一角,菜鸟大雄还仍然是菜鸟大雄……&/p&&h2&越来越庞大的构造函数&/h2&&p&一天,晨会过后,哆啦对大雄说,“大雄,我们的订单接口和支付接口都已经非常完善了,现在需要&b&在支付完成时更新一下订单的状态&/b&,你看看这个需求如何实现。”&br&&br&“这个好办,只需要给支付接口添加一个新的依赖IOrderDao,然后把OrderDao注入进去就可以了。”&br&&br&“好小子,张嘴一个‘依赖’,闭嘴一个‘注入’,术语说的挺溜的呀”&br&&br&“那是,你等着,马上搞定这个需求”,说完,大雄就火急火燎地写代码去了。&/p&&p&大雄给PaymentAction加了一个成员变量orderDao,然后新建了一个构造函数,把orderDao注入到PaymentAction里面去,接着写了一个updateOrderAfterPayment方法,调用orderDao的方法更新订单(&b&本文使用的代码,可以到 &a href=&http://link.zhihu.com/?target=https%3A//github.com/hzy38324/SpringNovel& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&SpringNovel&/a& 下载,欢迎加星&/b&):&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kd&&public&/span& &span class=&kd&&class&/span& &span class=&nc&&PaymentAction&/span& &span class=&o&&{&/span&
&span class=&kd&&private&/span& &span class=&n&&ILogger&/span& &span class=&n&&logger&/span&&span class=&o&&;&/span&
&span class=&c1&&// new proprety !!!&/span&
&span class=&kd&&private&/span& &span class=&n&&IOrderDao&/span& &span class=&n&&orderDao&/span&&span class=&o&&;&/span&
&span class=&kd&&public&/span& &span class=&nf&&PaymentAction&/span&&span class=&o&&(&/span&&span class=&n&&ILogger&/span& &span class=&n&&logger&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&kd&&super&/span&&span class=&o&&();&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&logger&/span& &span class=&o&&=&/span& &span class=&n&&logger&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&c1&&// new constructor !!!&/span&
&span class=&kd&&public&/span& &span class=&nf&&PaymentAction&/span&&span class=&o&&(&/span&&span class=&n&&ILogger&/span& &span class=&n&&logger&/span&&span class=&o&&,&/span& &span class=&n&&IOrderDao&/span& &span class=&n&&orderDao&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&kd&&super&/span&&span class=&o&&();&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&logger&/span& &span class=&o&&=&/span& &span class=&n&&logger&/span&&span class=&o&&;&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&orderDao&/span& &span class=&o&&=&/span& &span class=&n&&orderDao&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&pay&/span&&span class=&o&&(&/span&&span class=&n&&BigDecimal&/span& &span class=&n&&payValue&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&logger&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&(&/span&&span class=&s&&&pay begin, payValue is &&/span& &span class=&o&&+&/span& &span class=&n&&payValue&/span&&span class=&o&&);&/span&
&span class=&c1&&// do otherthing&/span&
&span class=&c1&&// ...&/span&
&span class=&n&&logger&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&(&/span&&span class=&s&&&pay end&&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&c1&&// new method !!!&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&updateOrderAfterPayment&/span&&span class=&o&&(&/span&&span class=&n&&String&/span& &span class=&n&&orderId&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&orderDao&/span&&span class=&o&&.&/span&&span class=&na&&updateOrderAfterPayment&/span&&span class=&o&&(&/span&&span class=&n&&orderId&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&最后大雄修改了一下payment.xml,注入orderDao:&/p&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&&span class=&nt&&&bean&/span& &span class=&na&&id=&/span&&span class=&s&&&paymentAction&&/span& &span class=&na&&class=&/span&&span class=&s&&&com.springnovel.payment.springxml.PaymentAction&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&constructor-arg&/span& &span class=&na&&ref=&/span&&span class=&s&&&serverLogger&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&/constructor-arg&&/span&
&span class=&nt&&&constructor-arg&/span& &span class=&na&&ref=&/span&&span class=&s&&&orderDao&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&/constructor-arg&&/span&
&span class=&nt&&&/bean&&/span&
&span class=&nt&&&bean&/span& &span class=&na&&id=&/span&&span class=&s&&&serverLogger&&/span& &span class=&na&&class=&/span&&span class=&s&&&com.springnovel.perfectlogger.ServerLogger&&/span& &span class=&nt&&/&&/span&
&span class=&nt&&&bean&/span& &span class=&na&&id=&/span&&span class=&s&&&orderDao&&/span& &span class=&na&&class=&/span&&span class=&s&&&com.springnovel.dao.OrderDao&&/span& &span class=&nt&&/&&/span&
&/code&&/pre&&/div&&p&就这样,大雄很快实现了往支付接口添加订单更新功能的需求,兴冲冲地给哆啦提交了代码Review的请求…&/p&&p&很快,Review结果回来了:&/p&&ul&&li&如果后面PaymentAction需要依赖更多的接口,比如短信发送接口、支付宝接口、微信支付接口等等,你还是往构造函数里面加吗?假如&b&依赖了20个接口,那你的构造函数就会有20个参数&/b&,就像下面这段代码,你觉得这样的代码优雅吗?&/li&&/ul&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kd&&public&/span& &span class=&nf&&PaymentAction&/span&&span class=&o&&(&/span&&span class=&n&&ILogger&/span& &span class=&n&&logger&/span&&span class=&o&&,&/span& &span class=&n&&IOrderDao&/span& &span class=&n&&orderDao&/span&&span class=&o&&,&/span& &span class=&n&&ISMSUtil&/span& &span class=&n&&smsUtil&/span&&span class=&o&&,&/span& &span class=&n&&IPaybal&/span& &span class=&n&&paybal&/span&&span class=&o&&,&/span& &span class=&n&&IWechatPay&/span& &span class=&n&&wechatPay&/span&&span class=&o&&,&/span& &span class=&o&&...)&/span& &span class=&o&&{&/span&
&span class=&kd&&super&/span&&span class=&o&&();&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&logger&/span& &span class=&o&&=&/span& &span class=&n&&logger&/span&&span class=&o&&;&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&orderDao&/span& &span class=&o&&=&/span& &span class=&n&&orderDao&/span&&span class=&o&&;&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&smsUtil&/span& &span class=&o&&=&/span& &span class=&n&&smsUtil&/span&&span class=&o&&;&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&paybal&/span& &span class=&o&&=&/span& &span class=&n&&paybal&/span&&span class=&o&&;&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&wechatPay&/span& &span class=&o&&=&/span& &span class=&n&&wechatPay&/span&&span class=&o&&;&/span&
&span class=&o&&...&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&哆啦的话再一次给大雄浇了一盘冷水,“为啥每次review都不能一次过……”&/p&&h2&Setter注入&/h2&&p&怎样解决构造函数越来越庞大的问题呢?大雄忽然想到之前在《Effective Java》的第一章看到的一个叫做&a href=&http://link.zhihu.com/?target=http%3A//blog.csdn.net/hzy38324/article/details/t1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Builder模式&/a&的例子,Builder模式把一个原本很庞大的构造函数,简化成一个小的的构造函数外加很多个set函数。&br&&br&“啊,不一定要用构造器注入!还有setter注入!”,大雄这才想起来之前学习Spring时看到的另一种注入方式 —— setter注入。&/p&&p&接下来,就是用setter注入改造PaymentAction了,大雄把之前含有两个参数的构造函数去掉,然后加上了一个setOrderDao方法:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kd&&public&/span& &span class=&kd&&class&/span& &span class=&nc&&PaymentAction_SetInjection&/span& &span class=&o&&{&/span&
&span class=&kd&&private&/span& &span class=&n&&ILogger&/span& &span class=&n&&logger&/span&&span class=&o&&;&/span&
&span class=&kd&&private&/span& &span class=&n&&IOrderDao&/span& &span class=&n&&orderDao&/span&&span class=&o&&;&/span&
&span class=&kd&&public&/span& &span class=&nf&&PaymentAction_SetInjection&/span&&span class=&o&&(&/span&&span class=&n&&ILogger&/span& &span class=&n&&logger&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&kd&&super&/span&&span class=&o&&();&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&logger&/span& &span class=&o&&=&/span& &span class=&n&&logger&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&c1&&// setter injection !!!&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&setOrderDao&/span&&span class=&o&&(&/span&&span class=&n&&IOrderDao&/span& &span class=&n&&orderDao&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&orderDao&/span& &span class=&o&&=&/span& &span class=&n&&orderDao&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&pay&/span&&span class=&o&&(&/span&&span class=&n&&BigDecimal&/span& &span class=&n&&payValue&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&logger&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&(&/span&&span class=&s&&&pay begin, payValue is &&/span& &span class=&o&&+&/span& &span class=&n&&payValue&/span&&span class=&o&&);&/span&
&span class=&c1&&// do otherthing&/span&
&span class=&c1&&// ...&/span&
&span class=&n&&logger&/span&&span class=&o&&.&/span&&span class=&na&&log&/span&&span class=&o&&(&/span&&span class=&s&&&pay end&&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&updateOrderAfterPayment&/span&&span class=&o&&(&/span&&span class=&n&&String&/span& &span class=&n&&orderId&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&n&&orderDao&/span&&span class=&o&&.&/span&&span class=&na&&updateOrderAfterPayment&/span&&span class=&o&&(&/span&&span class=&n&&orderId&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&接着再修改一下payment.xml,使用&property&标签,注入orderDao:&/p&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&&span class=&nt&&&bean&/span& &span class=&na&&id=&/span&&span class=&s&&&paymentAction_setInjection&&/span& &span class=&na&&class=&/span&&span class=&s&&&com.springnovel.payment.springxml.PaymentAction_SetInjection&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&constructor-arg&/span& &span class=&na&&ref=&/span&&span class=&s&&&serverLogger&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&/constructor-arg&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&orderDao&&/span& &span class=&na&&ref=&/span&&span class=&s&&&orderDao&&/span&&span class=&nt&&&&/property&&/span&
&span class=&nt&&&/bean&&/span&
&/code&&/pre&&/div&&p&测试一下:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&test_PaymentAction_UpdateOrder_XML_SetInjection&/span&&span class=&o&&()&/span& &span class=&o&&{&/span&
&span class=&n&&ApplicationContext&/span& &span class=&n&&context&/span& &span class=&o&&=&/span& &span class=&k&&new&/span& &span class=&n&&ClassPathXmlApplicationContext&/span&&span class=&o&&(&/span&&span class=&s&&&payment.xml&&/span&&span class=&o&&);&/span&
&span class=&n&&PaymentAction_SetInjection&/span& &span class=&n&&paymentAction&/span& &span class=&o&&=&/span& &span class=&o&&(&/span&&span class=&n&&PaymentAction_SetInjection&/span&&span class=&o&&)&/span& &span class=&n&&context&/span&&span class=&o&&.&/span&&span class=&na&&getBean&/span&&span class=&o&&(&/span&&span class=&s&&&paymentAction_setInjection&&/span&&span class=&o&&);&/span&
&span class=&n&&paymentAction&/span&&span class=&o&&.&/span&&span class=&na&&updateOrderAfterPayment&/span&&span class=&o&&(&/span&&span class=&s&&&123456&&/span&&span class=&o&&);&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&Output:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&real update order after payment, orderId is 123456
&/code&&/pre&&/div&&p&“完美!setter注入其实也没什么嘛!”,大雄大叫道,偷偷瞄了哆啦一眼,哆啦此时正专注地看着自己的屏幕,似乎没有觉察到这边厢亢奋的大雄。&/p&&h2&空指针异常!&/h2&&p&大雄再一次准备给哆啦提交review请求,在食指即将按下回车的那一刹那,他仿佛拥有了窥视未来的能力,他看到哆啦拿着装满冷水的脸盆,朝他洒过来….&br& “啊,不对劲,那这样构造器注入岂不是完败于setter注入了?不科学呀。。。setter注入肯定有什么局限是我还没发现的…..”&/p&&p&“Spring容器初始化对象时,会去调用对象的构造函数,此时如果采用构造器注入,并且xml里没有配置对应的&constructor&标签,那么由于没有与之匹配的构造函数,注入应该会失败”&br&&br&“而setter注入,如果没有配置&property&,是会提示初始化失败呢,还是压根就不注入呢?”,大雄的脑袋飞快地翻转着。&/p&&p&“修改一下代码,验证一下不就知道了!”&br&于是大雄首先把&constructor&标签注释掉:&/p&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&&span class=&nt&&&bean&/span& &span class=&na&&id=&/span&&span class=&s&&&paymentAction_setInjection&&/span& &span class=&na&&class=&/span&&span class=&s&&&com.springnovel.payment.springxml.PaymentAction_SetInjection&&/span&&span class=&nt&&&&/span&
&span class=&c&&&!--&constructor-arg ref=&serverLogger&&--&&/span&
&span class=&c&&&!--&/constructor-arg&--&&/span&
&span class=&nt&&&property&/span& &span class=&na&&name=&/span&&span class=&s&&&orderDao&&/span& &span class=&na&&ref=&/span&&span class=&s&&&orderDao&&/span&&span class=&nt&&&&/property&&/span&
&span class=&nt&&&/bean&&/span&
&/code&&/pre&&/div&&p&执行测试用例,果然报错了:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&org.springframework.beans.factory.BeanCreationException:
&/code&&/pre&&/div&&p&提示“没有默认的构造函数”,可见由于没有配置&constructor&标签,Spring容器调用了空参数的构造函数,而PaymentAction类并没有空参的构造函数,因此报错了,&b&这种错误会导致容器初始化失败,因此很容易发现&/b&。&/p&&p&接着大雄撤销了操作,然后把&property&标签注释掉:&/p&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&&span class=&nt&&&bean&/span& &span class=&na&&id=&/span&&span class=&s&&&paymentAction_setInjection&&/span& &span class=&na&&class=&/span&&span class=&s&&&com.springnovel.payment.springxml.PaymentAction_SetInjection&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&constructor-arg&/span& &span class=&na&&ref=&/span&&span class=&s&&&serverLogger&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&/constructor-arg&&/span&
&span class=&c&&&!--&property name=&orderDao& ref=&orderDao&&&/property&--&&/span&
&span class=&nt&&&/bean&&/span&
&/code&&/pre&&/div&&p&重新执行测试用例,啊,报错了! 空指针异常!:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&java.lang.NullPointerException
at com.springnovel.payment.springxml.PaymentAction_SetInjection.updateOrderAfterPayment(PaymentAction_SetInjection.java:34)
at com.springnovel.test.PaymentTest.test_PaymentAction_UpdateOrder_XML_SetInjection(PaymentTest.java:46)
&/code&&/pre&&/div&&p&看来如果没有在xml里面指定要注入的对象,那么set注入不会失败,所依赖的对象没有被注入任何对象,因此默认为null。&br&“这可不太好,&b&万一真的粗心大意忘了在xml里面指定要注入的对象呢,容器是可以成功启动,但是运行时可就挂了。。。&/b&”&br&&br&“有没有办法让setter注入的属性成为必填项呢?”&/p&&p&大雄决定上网搜索一下资料,打开Google,输入“spring setter bitian…”&br&&br&“啊不。。什么鬼。。。必填英文怎么说来着。。。”&br&&br&“噢噢,required嘛,HTML5的一个必填校验属性就叫Required”&br&&br&噼里啪啦,大雄输入了“spring setter required”&br&&br&很快,他发现Spring2.0提供了一个@Required注解……&/p&&h2&Reuqired注解&/h2&&p&“这就好办了!”,大雄对照着教程,修改起了代码。&br&首先要开启Spring注解的功能,给payment.xml加入这些配置:&/p&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&&span class=&nt&&&beans&/span&
&span class=&err&&...&/span&
&span class=&na&&xmlns:context=&/span&&span class=&s&&&http://www.springframework.org/schema/context&&/span&
&span class=&na&&xsi:schemaLocation=&/span&&span class=&s&&&&/span&
&span class=&s&&
...&/span&
&span class=&s&&
http://www.springframework.org/schema/context&/span&
&span class=&s&&
http://www.springframework.org/schema/context/spring-context-2.5.xsd&&/span&&span class=&nt&&&&/span&
&span class=&nt&&&context:annotation-config/&&/span&
&/code&&/pre&&/div&&p&接着再给PaymentAction的setOrderDao方法加入@Required注解:&/p&&div class=&highlight&&&pre&&code class=&language-java&&&span&&/span&&span class=&nd&&@Required&/span&
&span class=&kd&&public&/span& &span class=&kt&&void&/span& &span class=&nf&&setOrderDao&/span&&span class=&o&&(&/span&&span class=&n&&IOrderDao&/span& &span class=&n&&orderDao&/span&&span class=&o&&)&/span& &span class=&o&&{&/span&
&span class=&k&&this&/span&&span class=&o&&.&/span&&span class=&na&&orderDao&/span& &span class=&o&&=&/span& &span class=&n&&orderDao&/span&&span class=&o&&;&/span&
&span class=&o&&}&/span&
&/code&&/pre&&/div&&p&再次执行测试用例,结果当然还是报错,不过这次是在容器初始化就提示错误了:&/p&&div class=&highlight&&&pre&&code class=&language-text&&&span&&/span&org.springframework.beans.factory.BeanCreationException:
Property 'orderDao' is required for bean 'paymentAction_setInjection'
&/code&&/pre&&/div&&p&“这下好了,在Spring容器创建对象时就报错了,不会等到执行代码时再来抛个空指针异常,简直是粗心大意的程序员的救星啊!”&/p&&p&大雄仔细地对代码做了检查,最后敲了回车,给哆啦提交了Review请求。&/p&&p&“叮,pass!”,大概过了半个小时,屏幕弹出通知,大雄的代码终于通过了哆啦和小组成员的检视,成功提交到代码库了!&/p&&h2&大雄的笔记&/h2&&p&今天大雄学到了构造器注入之外的另外一种注入方式——setter注入,临睡前,大雄习惯性地对今天所学到的知识做了总结:&/p&&ul&&li&Constructor注入 vs Setter注入&/li&&ul&&li&Constructor注入能够强制要求调用者注入构造函数中的所有参数,否则在容器初始化时就会失败;但是如果要注入的对象过多,就会导致&b&构造函数过于庞大&/b&。&/li&&li&Setter注入,类似于Builder模式,将原本庞大的构造函数,拆解为了&b&一个小的构造函数&/b&和&b&许多个set方法&/b&。setter注入不能保证对象一定会被注入,但是可以使用&b&@Required&/b&注解,强制要求使用者注入对象,否则在容器初始化时就会报错。&/li&&/ul&&/ul&&p&总结完,大雄一跃而起,啪的一下蹦到了席梦思上,整个人成“大”字状,眼睛一闭,嘴巴一张,很快进入了梦乡……&/p&&h2&大雄的梦&/h2&&p&睡梦中,大雄看到了一只非常奇怪的“三眼乌鸦”,“三眼乌鸦”静静的木在树枝上,等大雄一靠近,就很快地飞到另一颗树上,大雄就这样追了好久….&br&突然,大雄看到一座桥,桥头立着一块牌子,上面写着“Bridge for You”&br&“桥为我?桥给我??”&br&&br&一旁的“三眼乌鸦”实在看不下去了,骂道,“是给你准备的桥!笨蛋!”&br&&br&“给我准备的?那我得走过去看看!”,说完,大雄走进了那座桥 – &a href=&http://link.zhihu.com/?target=http%3A//bridgeforyou.cn/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Bridge for You&/a& ……&/p&&p&桥的对面有一间茅草屋,门没关,大雄看了看,好像没人,走了进去,发现里屋有个少年,正在敲着键盘。大雄凑过去偷看,那少年好像在写小说,小说标题是“用小说的形式讲解Spring…”,大雄心想怎么会有人起这么挫的标题。那少年一边敲着键盘,一边还叨叨道,“大雄啊大雄,哥最近换了新部门,忙得很,一周只能过来看你一次啦……”&/p&&h2&未完待续&/h2&&p&第二天一大早,手机突然响了,睡梦中的大雄迷迷糊糊地接了电话…&/p&&p&“喂!大雄啊,还在睡觉啊??快起来,有个需求要改一下!”,原来是那个讨厌的项目经理胖虎…&br&&br&“改..改需求?!”&br&&br&“之前不是让你们把日志打印到日志服务器了吗?刚刚客户说了,要换,要打到控制台!今天早上就要改完!”&br&&br&“哇靠….”大雄脱口而出,不过他很快就暗暗高兴,因为他知道由于采用了依赖注入,现在他只需要改一处配置,“哎呀,这客户咋那么多事,你等着啊,我现在改,要改的地方多着呢,改完你得请我吃饭”&br&&br&“小兔崽子,项目上线了你要吃多少都行!”&/p&&p&大雄马上起身,打开便携,把payment.xml的ServerLogger改为了ConsoleLogger: &/p&&div class=&highlight&&&pre&&code class=&language-xml&&&span&&/span&&span class=&nt&&&bean&/span& &span class=&na&&id=&/span&&span class=&s&&&serverLogger&&/span& &span class=&na&&class=&/span&&span class=&s&&&com.springnovel.perfectlogger.CosoleLogger&&/span&&span class=&nt&&/&&/span&
&/code&&/pre&&/div&&p&“要测试一下吗?哎,算了,测啥测,肯定没问题”,说完大雄提交了代码给胖虎,然后给胖虎发了条信息,让他审核一下。&br&胖虎很快将大雄的代码提交到代码库…&/p&&p&“真是的,搞得我觉都没睡好…”,大雄正准备睡个回笼觉….手机又响了…&br&&br&“大雄,你怎么搞得!改了你的代码,现在服务器连启动都失败了!”&br&&br&“啊???怎么可能…”,大雄一脸懵逼……&/p&&h2&参考内容&/h2&&ul&&li&《Spring in Action》&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//stackoverflow.com/questions//explain-why-constructor-inject-is-better-than-other-options& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Explain why constructor inject is better than other options&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//spring.io/blog//setter-injection-versus-constructor-injection-and-the-use-of-required/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Setter injection versus constructor injection and the use of @Required&/a&&/li&&li&&a href=&http://link.zhihu.com/?target=https%3A//www.mkyong.com/spring/spring-dependency-checking-with-required-annotation/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Spring dependency checking with @Required Annotation&/a&&/li&&/ul&
本集概要:构造器注入有什么缺点?如何使用setter注入?setter注入为什么会导致空指针异常?前情回顾:大雄给项目引入了Spring框架,解决了代码过度耦合的问题,当然,这只是Spring强大功力的冰山一角…
&figure&&img src=&https://pic4.zhimg.com/v2-630ffefcc284ec6c413a678_b.jpg& data-rawwidth=&900& data-rawheight=&500& class=&origin_image zh-lightbox-thumb& width=&900& data-original=&https://pic4.zhimg.com/v2-630ffefcc284ec6c413a678_r.jpg&&&/figure&&h2&&b&前言:&/b&&/h2&&p&有天吃饭和朋友聊天,说到大学老师布置的开发项目,结果我们一干人说出来的都基本一样,入门级别的计算器啦,稍微大一点的记事本啦,然后到后面的图书管理系统啊,购物网站啊……&/p&&p&发现这些项目都是大学老师特别爱布置下来的开发项目!!而且一定要是Java语言开发的,看来以前我们大学基本都是学Java嘛(当然现在应该不是了吧~),因此我觉得我一定要整理一个这样文章,把大学老师一定会布置的项目罗列出来,并介绍一些开发教程。&/p&&h2&&b&&a href=&https://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/185& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【Java开发简单的计算器】&/a&&/b&&/h2&&p&计算器是大学老师一定会布置的!!!稍微学了一点语言基础之后,老师就会说“这周下去自己开发一个计算器吧,下次上课前交给我。”&/p&&p&我们做出来绝对就差不多是这个样子的,当然这是教程的效果图:&/p&&figure&&img src=&https://pic1.zhimg.com/v2-6b17fd612b40f3aebae4ce21a5f3cb9c_b.jpg& data-rawwidth=&282& data-rawheight=&192& class=&content_image& width=&282&&&/figure&&p&&b&课程简介:&/b&&/p&&p&使用 Java 语言完成了一个简单的计算器,将使用到 Java Swing 图形组件等等,让大家深入学习如何制作 Swing 图形化界面以及为 UI 组件设置事件响应逻辑。&/p&&p&&b&知识点:&/b&&/p&&ul&&li&Java Swing 界面编程&/li&&li&计算器逻辑运算实现&/li&&/ul&&h2&&b&&a href=&https://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/154& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【Java实现记事本】&/a&&/b&&/h2&&p&当我们学了文件读写之后,老师接下来一定会布置记事本项目!项目相对来说比较简单,同时也很有趣。&/p&&figure&&img src=&https://pic3.zhimg.com/v2-2dbbbf906ebecf477cf485b_b.jpg& data-rawwidth=&561& data-rawheight=&613& class=&origin_image zh-lightbox-thumb& width=&561& data-original=&https://pic3.zhimg.com/v2-2dbbbf906ebecf477cf485b_r.jpg&&&/figure&&p&&b&课程简介:&/b&&/p&&p&讲解如何使用 Java 语言编写一个可视化的记事本应用,涉及到 Swing 界面编程、文件读写等知识点;让大家熟练Java的可视化界面编程以及文件和IO操作。&/p&&p&&b&知识点:&/b&&/p&&ul&&li&Java Swing 界面编程&/li&&li&文件操作&/li&&li&Java IO&/li&&/ul&&h2&&b&&a href=&https://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/260& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【Java日记软件】&/a&&/b&&/h2&&p&呵呵呵,这个日记软件,肯定会布置的,反正当年我们Java老师布置这个项目,我记得啊,当时我学的比较差,开发一个日记软件搞了几个通宵……&/p&&p&下图是这个项目的效果图,虽然我当时做出来的效果和这个不太一样,我说的是界面展示啊,但是其中后台的逻辑啊,肯定一样的:&/p&&figure&&img src=&https://pic4.zhimg.com/v2-17bfcb8f4ebf8d248f6b3_b.jpg& data-rawwidth=&646& data-rawheight=&439& class=&origin_image zh-lightbox-thumb& width=&646& data-original=&https://pic4.zhimg.com/v2-17bfcb8f4ebf8d248f6b3_r.jpg&&&/figure&&p&&b&课程简介:&/b&&/p&&p&实现一个简单的 Java 日记软件,可以实现用户的注册、登录以及对日记的各种操作。项目中涉及了包括 Swing 界面编程、文件和IO流操作、JDOM 解析 XML 文档等方面的知识点。&/p&&p&&b&项目列表:&/b&&/p&&figure&&img src=&https://pic3.zhimg.com/v2-30dacfe8ca2a24d1cbdf56_b.jpg& data-rawwidth=&591& data-rawheight=&471& class=&origin_image zh-lightbox-thumb& width=&591& data-original=&https://pic3.zhimg.com/v2-30dacfe8ca2a24d1cbdf56_r.jpg&&&/figure&&h2&&b&&a href=&https://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/113& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【Java和WebSocket开发网页聊天室】&/a&&/b&&/h2&&p&天啊,学了WebSocket之后,哪能不开发聊天室呢!!!记得第一次开发出来时,觉得好神奇啊,感觉自己开发了一个QQ,哈哈哈。&/p&&p&下图是这个项目的效果图:&/p&&figure&&img src=&https://pic2.zhimg.com/v2-2e6d2a790a_b.jpg& data-rawwidth=&1022& data-rawheight=&641& class=&origin_image zh-lightbox-thumb& width=&1022& data-original=&https://pic2.zhimg.com/v2-2e6d2a790a_r.jpg&&&/figure&&p&&b&课程简介:&/b&&/p&&p&使用WebSocket来开发网页聊天室,前端框架使用AmazeUI,后台使用Java,编辑器使用UMEditor。课程能够让大家了解如何开发一个简单的网页聊天室。&/p&&p&&b&知识点:&/b&&/p&&ul&&li&网页前端(HTML + CSS + JS)&/li&&li&Java&/li&&li&WebSocket&/li&&/ul&&h2&&b&&a href=&https://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/891& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【Java模拟实现实验楼课程管理系统】&/a&&/b&&/h2&&p&嗯,我介绍的这个是课程管理系统,可是不觉得和图书管理系统很像么?!!图书管理系统难道不是每个大学老师都会布置的开发项目吗?!!!&/p&&p&我记得当时老师布置这个是以小组形式,需要两个角色,一个管理者,可以增删改查,一个维护者(制作者),维护书籍和制作书籍等,4个人,一人负责一点,看起来很简单哈,可是啊,在大学的时候,我觉得好难啊!!&/p&&figure&&img src=&https://pic1.zhimg.com/v2-8875aeaf88e947b35d65_b.jpg& data-rawwidth=&1091& data-rawheight=&878& class=&origin_image zh-lightbox-thumb& width=&1091& data-original=&https://pic1.zhimg.com/v2-8875aeaf88e947b35d65_r.jpg&&&/figure&&p&&b&课程简介:&/b&&/p&&p&课程使用spring+spring MVC+hibernate来模拟实验楼课程管理系统。系统使用者分为课程管理者和课程制作者两个角色,他们分别有自己的功能和权限。&/p&&p&&b&实验列表:&/b&&/p&&figure&&img src=&https://pic4.zhimg.com/v2-c1efe41eed82dd0bffdc8_b.jpg& data-rawwidth=&596& data-rawheight=&463& class=&origin_image zh-lightbox-thumb& width=&596& data-original=&https://pic4.zhimg.com/v2-c1efe41eed82dd0bffdc8_r.jpg&&&/figure&&h2&&b&&a href=&https://link.zhihu.com/?target=https%3A//www.shiyanlou.com/courses/824& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&【SSM + easyUI 搭建简易的人事管理系统】&/a&&/b&&/h2&&p&人事管理系统,感觉和图书管理系统啊,课程管理系统啊类似,反正老师会布置其中一个!&/p&&figure&&img src=&https://pic3.zhimg.com/v2-c9e350a29fcd8a73372ca5eae0c178cb_b.jpg& data-rawwidth=&1140& data-rawheight=&688& class=&origin_image zh-lightbox-thumb& width=&1140& data-original=&https://pic3.zhimg.com/v2-c9e350a29fcd8a73372ca5eae0c178cb_r.jpg&&&/figure&&p&&b&课程简介:&/b&&/p&&p&课程采用 SSM(Spring + Spring MVC + MyBatis) + easyUI 来开发一个比较简易的人事管理系统,让同学们能够通过实际项目掌握 SSM 项目的开发。&/p&&p&&b&实验列表:&/b&&/p&&figure&&img src=&https://pic2.zhimg.com/v2-57f73b8d88_b.jpg& data-rawwidth=&580& data-rawheight=&462& class=&origin_image zh-lightbox-thumb& width=&580& data-original=&https://pic2.zhimg.com/v2-57f73b8d88_r.jpg&&&/figure&&figure&&img src=&https://pic1.zhimg.com/v2-bf3e8afb875f_b.jpg& data-rawwidth=&533& data-rawheight=&528& class=&origin_image zh-lightbox-thumb& width=&533& data-original=&https://pic1.zhimg.com/v2-bf3e8afb875f_r.jpg&&&/figure&&figure&&img src=&https://pic4.zhimg.com/v2-2f8e1febcd_b.jpg& data-rawwidth=&523& data-rawheight=&315& class=&origin_image zh-lightbox-thumb& width=&523& data-original=&https://pic4.zhimg.com/v2-2f8e1febcd_r.jpg&&&/figure&&h2&&b&&a href=&https://link.zhihu.com/?t

我要回帖

更多关于 无法找到入口 的文章

 

随机推荐