为了账号安全,请及时绑定邮箱和手机立即绑定

【花式填坑No.12】技术干货:恕我直言,你们真的懂Java框架吗?

图片描述
 
就IT行业而言,技术的更新与迭代虽然时刻都在进行,加上大部分互联网公司而言,他们追求的都是低成本、高效益,需要的更是能直接进入工作状态的人才。
 
所以当万事都开始追求极速与简洁的时候,身为程序员的我们更应该与时俱进,了解框架的使用!
 
本文选自花式填坑12期,讲师在线答疑用户对Java学习的干货内容。

 

学习Java框架产生的问题

 
Q:Java中涉及到一些固定死的知识。例如Spring的配置我个人感觉每个项目都只有一两次配置,之后就落实到具体的代码实现。把时间花费在记忆这些基本固定死的东西上会不会显得有些死板。这个问题我觉得在我们编程中是常常需要取舍这些固定的知识是要交给搜索引擎还是留容量本就不高的大脑里。
 
另外一个问题我也想请教老师回答一些,由于我面试次数并不多,面试官在面试时会特别注意这些细节上固定死的知识吗?

 
源生活:刚入这一行需要记死的东西可能是少不掉的,因为这个时候很难有能力掌握这些【死的东西】背后是要做什么,和什么原理能对得上。面试官会视你工作时间长短,如果没有工作经验,可能会问框架的使用,或者问框架的流程等,因为这个时候他愿意招你基本上是要你进公司就能干活的。除非你表现的能力很强,这时可能会继续探测你能力的上限。
 
等工作一段时间,需要自我感觉不好,代码的逻辑、结构其实不好,这时就有动力去探寻一下框架【死的知识】背后,如果你一直自我感觉良好那就麻烦了。探寻完了会发现,无非也就是那么回事,如果你自己搞个框架,难道就不让别人记【死的东西】了?一样的,这个是框架本身的规则。 关于记这个【死的知识】,我建议好记性不如烂笔头,用思维导图一类的,可以把相关知识串起来。
 
 
Q:向老师请教一下,做框架迁移比如从hibernate迁移到mybatis,应该怎么准备,实施中有什么需要注意的以及会有什么坑
 
源生活:最重要的是做好回归测试,最重要的是做好回归测试,最重要的是做好回归测试。 一定是在hibernate上进行过的完整的测试用例全部要留存,无论单元测试还是结合测试,做好版本控制,这么大的变更要有分支,万不得一可回退,所有之前在hibernate上做过的测试要在迁移后全部都能通过,当然,这也不能保证万无一失,这是要看原本的测试用例的质量的!
 
 
Q:学完javaweb基础学习阶段(javase、servlet、jsp等等),现在学框架,可以先跳过struts2、hibernate即ssh,直接学spring、spring-mvc、mybatis(ssm)吗???
 
源生活:这个没什么讲究,最重要的是学的过程中多考虑:这些框架和以前学过的知识有什么联系,比如你说的servlet。

 
 
Q:大学本科学的软件开发JAVA方向,当时不仅学了ssh,还有ejb,这两年框架的风好像刮得挺快的,ssm,springmvc,spring boot,现在企业的开发框架比较倾向于哪一种?
 
其他用户解答:springmvc是主流,其实我个人认为各种框架都是大同小异,用的技术都是很基础的,比如反射,多线程,泛型,注解等,优秀的框架在于优秀的设计思想,单例,抽象工厂,等都是常见的。工作中以及招聘的时候,我偏向于解决问题能力和应变能力而不是对方会多少框架。
 
源生活:1楼说的好,万变不离其宗,基础的东西,框架是逃不掉的,主要是看:
1、你现在面临什么问题?
2、什么框架能完全的或者更多的解决你的问题?
3、如果框架没有完全解决问题,基于这个框架的可扩展如何? 无论是流行框架还是企业内部框架都一样,而且这个框架要有人在持续维护。
 
企业的倾向要看企业是老的还是新的、企业文化是什么样的、企业的规模等等,这些因素会决定企业是保持原来太多的积淀不想乱动、还是勇于创新、还是反正是新公司,可以大胆的尝试新的东西、还是觉得企业规模太小,没必要这样折腾,并不能带来太多的好处,还要付出高昂的成本。 现在看慕课上Spring boot相关的课多起来了,后面应该还会有Spring cloud,但最终还是要看企业对利益的权衡。

 
 
Q:老师,我刚学完JSP和Servlet,准备学习框架,但是在慕课网上的框架视频,像Spring,完全听不懂配置,是不是有什么东西我还需要先学习么?
 
源生活:先弄清楚框架所解决的问题再学,我换句话说:你已经会jsp和Servlet了,不是也能做点东西了吗?这样有什么问题吗?如果你觉得有问题,那问题在哪?这个框架能帮你解决吗?

 
 
Q:6月拿到毕业证了,大专学历,实习公司转正6k,找到一家开7.5k的公司,不过找到的公司是做政府项目的,需要外派的那种,技术用    struts+spring+hibernate的。我现在的实习转正公司用Spring 、 SpringMVC 和 Mybatis、spring boot。求老师给点建议,去薪资高的还是留下转正技术方向好的?ssh是不是太传统对以后发展不好,是不是这样的呢?求老师给点建议,也是考虑在技术框架上
 
源生活:因为大部分同学都是停留在【会使用】的基础上、并且都是希望从工作的内容上吸取到更多的养分,才会有这样的问题,所以一味的考量公司在用什么,能给我带来什么。其实更多的应该考虑,我能为公司做什么,我不是在给鸡汤,也不是在讲多么伟大的理想,是事实:

1、公司准备让我做的事是不是苦力活?我有没有办法在这个岗位上突破,把苦力活自动化,为公司解决问题的同时也留出更多的时间来学习。

2、当我有一定能力积累,并且发现公司的一些问题的时候,我能不能推动这些问题的解决?能力从哪来?把第1件事做好再谈这个。

3、如果公司不能提供这样的机会来发挥我所学,再考虑换工作。当然,不要搞到最后发现不是公司不给机会,是自己能力不够,那还要再来。

这个时候你会发现,新框架也罢,老框架也罢,你具备的是什么?【解决问题的能力】,这玩意,什么框架都代替不了。通过学习框架来提高【解决问题的能力】只是一种方式,并不是目的。

 
 
Q:源老师好,请问在生成开发环境中有那些框架是主流的呢?我只学习了ssm框架,感觉有好多地方问题用这框架难以解决。源老师,能给我们列表一些现在的那些主流框架分别解决那些问题吗?
 
源生活:你有这种感觉就对了,本来这些框架就不是为了【你的问题】而生的,要根据你的问题去找,看有没有可以解决这个问题并能很容易融进来的框架,或者是自己写代码解决,很多企业不是经常这样吗,基于流行框架,甚至不基于任何框架,封装一套解决自己企业独特问题的框架。这要根据情况来,核算一下如何做是较小的成本。
 

 
Q:老师,我现在找工作,问道公司是用到传统技术ssh框架的,我就没打算聊下去,因为自己刚出来,想找个技术氛围的平台,以后跳槽也有好的优势,我这样做可以吗?
 

源生活:对于工作时间较短且没有自制力的同学来说,好的氛围确实会对人有影响,但我没明白【传统技术ssh框架】和【技术氛围的平台】有什么必然联系吗?我知道有的公司是不用任何框架的,JDK就够了,自己有专门的部门来打造、维护自己公司独特的框架,这样的算是有【技术氛围的平台】还是算没有呢?你不用急着解释,如果你确实发现这个公司不符合你的要求,可以做出这样的选择。
 
但是我最后说一句最重要的,靠人不如靠自己,无论在什么样的环境,你把事情做到极致,注意,一定要做到【极致】,这对你的功力有相当高的要求,如果你一直这样来看待问题并且照做,就算没做到【极致】,但能力提升我想是杠杠的,这时再看在什么样的环境重要吗?可能连收入都不是问题了吧?想去哪,已经完全在于你怎么选,而不是公司要不要你。

 
 
Q:老师,想问一下,如何去看 框架的源码,点击进去, 一个方法接着一个方法,需要每个方法都看懂吗, 应该怎么才能知道框架中这个方法是如何实现的,如何逻辑清晰的读懂源码,知道这个源码的大体架构
 

源生活:点击进去,一个方法接着一个方法,这样看源码不是好办法,追踪源码解决问题的时候会这么干,但要了解框架的大体架构不能先看细节,那样就被困在里面了。 要通过官方文档、或者其他网站上的技术文档去找,框架结构的那种图,包括结构、层次关系、关键接口、流程和功能描述等,用这种方法把整个框架大概的给描绘出来,了解一下我们平时使用一个功能时,这个功能在这种图里是由哪几个关键接口支撑了这个功能,整个过程是什么样的,然后再去找这些接口以及实现类,再去研究细节。

 
 
Q:老师  我是菜鸟,我想问一下, 比如说练习题拿过来的时候  按道理说都应该知道步骤  和怎样去写代码才能实现  但是我  一点思路都没有, 拿过练习题,跟傻子一样按照图就开始写。
 
源生活:思路是什么?并不是写代码,思路是可以看是写伪代码的过程: 就是先干嘛,后干嘛,再干嘛,最后干嘛。这和生活中要做某件事,该如何考虑,并没有什么区别,如果你连这个都没办法思考,那不应该的。我举个最简单的例子,如何根据年份来判断是不是闰年,这最先的考虑,根本不是代码的问题,而是你的常识问题,这个你要先解决了,根据你的常识,是如何描述这个问题以及解决的伪代码,然后再把伪代码转成真正代码,那是另一回事,确定一下问题出在哪个环节了。

 
 
Q:我刚好有一个Java基础的问题搞不懂,找好多人问了,他们也答不上来,关于Java泛型。
 
Q1 : public static <T> void sort(List<T> list, Comparator<? super T> c)
Collections.sort()方法的Comparator参数,它的泛型使用了super通配符。我理解不了这里为什么要用super。
 
我能理解Collections.copy()方法中的两个参数的通配符,从src拷贝到dest中,src的extends表示数据全都可以视作T类型,dest的super表示List作为T类型的父类型,确保可以放入任何T类型对象。
 
同样的问题出现在我看RxJava源码时,public final <R> Observable<R> map(Function<? super T, ? extends R> mapper)操作符中,为什么会用<? super T>来表示被转换对象?
 
我大概知道一点PECS原则,可是我没有办法把这个原则用在理解这几个泛型通配符上。
 
Q2:假如我有一个类声明了泛型,如public class ResponseBase<T>{},在这个类中,我要怎样取得T的class对象?比如使用Gson解析Json的时候,调用方法时需要传入一个class对象。有办法能直接根据泛型取到class对象,而不用在构造方法中传入一个Class<T>的对象吗?

 
源生活:Q1:Collections.sort()方法是一个重载的方法,有一个参数的,两个参数的,一个参数,是需要List<T>中的这个T要已经实现了Comparable接口,才可以直接排序,否则就要再加一个参数,就是一个比较器,这个方法目的很明显,按正常来说,排序方法只用Collections.sort(List<T> list)这个方法难道不够用吗?够用了,那为什么还要再多一个方法,加入第二个参数?是让我们自己写的比较规则可以复用,这个比较器是基于T的父类来实现的,也就是说,基本上都是在用父类的一些属性来决定排序规则,当这些规则同样也适用于子类时,那不就能用Collections.sort(List<T> list, Comparator<? super T> c)这个方法来完成了吗?这样,T类(这里的T不止一种)不用实现比较规则,都用Comparator来完成比较规则,Comparator里是T的父类,Comparator可以用于N个像T这样的类的比较,来完成排序,这N个T这样的类,都是Comparator里实现的那个类的子类,然后这里的比较器要求<? super T>,必须是T的父类才能完成这个比较过程,这不是很合理吗?只有是T的父类才能完成共通的比较器规则,因为T的父类用到的属性,T类也继承过来了,是可以用的,如果<? super T>写成<T>,那这个比较器,只能用于T自身,那和不加这个参数也没什么区别,如果写成<? extends T>更是扯淡,子类的比较器是不能用于父类的,子类的比较器用到的一些属性,父类可不一定有。希望我这样说能说的明白!!
 
Q2:看下jackson的实现方式的源码,字符串转成指定java对象,如何解决java对象的class传入问题,甚至是带泛型的class,就是这行代码的背后源码,你好好体会一下:mapper.readValue("json字符串",new TypeReference<List<Map<String,自定义类型>>>() {});你看看这里要转换的目标java类型:List<Map<String,自定义类型>>,你用class怎么表示这样用泛型表示的嵌套复杂类型?jackson不也照样能正确的帮我们序列化成目标的java类型吗?是怎么做到的?去看看源码,很有意思,这样的问题如果能解决,你说的不传入class对象,而转成泛型指定的class对象,就不是问题了是吧?

 
 
Q:麻烦问下,学习ssh框架之前是不是一定要先学习servlet、jsp知识的?
 
源生活:必须的,那是根本,而且不止这些,否则你将会陷入一个又一个框架的使用规则的记忆中,而毫无感觉,并知道这些框架为什么要这样,这样做有什么好处,如果你不想做一个【使用者】的角色,而想做一个【主导者】的角色,先学java语言的基础和java web基础,JVM也可以看一看,使用框架时多提出好的问题然后自己找到答案,比如:这些框架和我之前学的基础到底有什么联系?

 

讲师个人主页,点击可查看

图片描述

点击查看更多内容
81人点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
全栈工程师
手记
粉丝
1000万
获赞与收藏
5105

关注作者,订阅最新文章

阅读免费教程

感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消