Java是一个生态体系,涉及的知识方方面面,从何处入手开讲,是个选择。
Java目前用于企业、互联网的方方面面,也和我们每个人息息相关,常见的应用场景有以下方面:
1、企业应用开发
2、互联网开发
3、大数据
4、安卓开发
5、Socket通信开发
每个应用场景都包含不同的技术,虽然都是java语言,但是除了语法相同外,其余差距较大。
先说企业应用开发,这个简称BS开发,就是浏览器端和服务器端编程。因为现在的企业内部管理系统多数都是BS模式了,还有极个别强业务、强操作的是CS,比如调度系统、视频监控系统等。BS相比CS的好处就是只要有个机器装了浏览器,就可以访问系统,简单方便,而且现在移动端也越来越普及,手机就可以直接使用管理系统,基本做到了移动办公。
当然这个BS的好处是显而易见的,这个好处是针对使用用户的,对开发人员提出来更高的要求。我最早也是做CS开发的,VB、Delphi都很熟悉,也做过不少,做CS开发的好处就是一个人基本能搞定界面设计、逻辑开发、数据库设计等,相对简单一些。但是到了BS,发现变化好多,首先是浏览器的交互方式变了,要求美观方面也变了,以前是能用就行,现在是不光能用,而且要人性化设计。所以出来了UI设计工程师、用户体验工程师,对开发领域做了更大的细分。为了应对这些,我们开发中要学习的东西更多了,不光是逻辑开发、还有界面开发。这两年随着H5的普及,UI技术突飞猛击,我几天不关注,一些新的技术就不懂了。比如Angular,Angular2才出来没几天,Angular4就出来,更可怕的是Angular5正在内测。这些东西大版本升级,很多内部接口都会变,都需要开发人员重新熟悉掌握。常见的后台开发模式是MVC,现在呢,前端也分MVC,而且更细化是MVVM,使用这些模式的框架包括Angular、React、Vue等,不学都不行。
前端说了这么多,再说说后端,这个就更复杂了,开源框架一个接着一个。老外的思想很单纯,我看着这个框架不爽,我就自己写一个,国外的思想是看着不爽,那就凑合用,等有更好的我再换,所以国内的技术比国外还是落后几年的。说后端开发肯定是从MVC说起,最基础的是JSP+Servlet+JavaBean,这一套我用过好多年,除了代码量多一些,不够优雅外,还是基本可以的,简单,基本俩小时就能熟悉上手。没有各种各样的新名词,碰到对象就new。当然这一套应对小系统、功能不复杂、访问量不大的是没问题的,而且好多东西也可以依赖Servlet自带的实现,比如filter、基于timer的定时任务、listener、session等。
控制层
后来Struts1横空出世了,当时是引起轰动的,因为不管是在学校还是在企业,如果会struts,不得了啊,这就是技术高人一等的感觉。我用struts1也做过几个项目,后来就不再用了,原因就是太繁琐了,不管是formbean的配置,还是action里面的代码,繁琐无比,解决的主要问题就是form字段自动封装,其余的好处没发现,可能是做的项目太小。
再后来webwork和struts2出来了,简化了相当多的配置,基本是颠覆struts1,里面引入的好多特性也都非常有用,在开发中最常用的是interceptor、表单标签、action里面表单自动封装,还有后来的注解。整个struts2配置相对简单,如果加上通配符,基本上配置没有太多。struts2.1后引入了注解,基本上就没啥配置了,用的人越来越多,不过遗憾的是,struts2有漏洞,拒绝服务、远程获取服务器权限这都是漏洞引起的后果,相当严重,好多系统都被攻击。引起这个漏洞的原因就是action的参数封装太复杂,就导致黑客高手里面参数拼一些带服务器命令的脚本,来进行攻击。apache是被动防守,有一个漏洞就打一次补丁,最近几年基本没有新特性,完全是打补丁。公司不管大小还是担心被攻击的,所以现在再有新项目,用struts2的也基本没有了,谁也不想还没开发就被扣上架构有缺陷的帽子。
我用struts2大概四年,参与了十多个项目,还是有比较深刻的体会的,确实开发很方便,性能也很不错。但是后来转springMVC了,趋势使然,不可避免。
刚开始转springMVC还不太习惯,不过用了一周后,发现SpringMVC太好用了。设计SpringMVC的人也确实独具慧眼,加上注解的引用,代码写不了几句就能完成大多数controller层的功能。最主要的是和spring无缝衔接,不像struts2还必须有一个struts-for-spring的插件来完成集成。现在基本项目controller都是采用SpringMVC,然后去年出现了SpringBoot,这是后话,以后再讲这个。
持久层
06年那会,Hibernate火起来了,火的原因就是项目开发不用写sql了,解放数据库了,而且兼容各个数据库。我是下过好几次决心要精通hibernate的,无奈确实学习曲线很高,最后还是在11年通过中石化的项目最终精通了,而且是相当精通,原因就是数据库的表设计不合理,全是大表,而且没有主键,两个表之间的关联都是多字段对应。那段时间每天都在研究hibernate的字段映射,多表关联有中间表和无中间表怎么设计,对应的HQL怎么写。当时的Hibernate版本是3.1,还发现了几个多表关联的错误。Hibernate还有一个大坑是JPA1.0和2.0的,Hibernate3.1是实现自己的持久化接口,到3.6版本后改为实现JPA2.0的接口,这个大坑就是WebLogic部署不支持了,和weblogic自带的有冲突,记得有一次项目部署,元旦期间,从白天部署,到凌晨三点还没搞好,最后改成tomcat了。至今想起来就觉得不该采用Hibernate,功能很简单,就是因为Hibernate,耽误太多事。Hibernate火的原因我感觉有以下几个:
1、程序员不用写sql了,这对于数据库不熟悉的人是个福音,但是做开发,如果不精通sql,肯定没发展,所以这并不是好消息。而且如果是复杂sql需要调优,Hibernate基本是无法实现的。
2、写代码可以不用考虑数据库因素了,可以跨数据库了。这个其实是有些自己骗自己的意思。首先至今为止我还没碰到哪个项目初期是用oracle,后期改mysql的,生产中换数据库的场景非常非常少。第二是各个数据库都有各自的特性,如果纯用Hibernate,有些特性是体现不出来的,比如mysql和sqlserver有自增主键,ID直接是AutoIncrement即可,但是Oracle是没有自增主键的,得通过序列来完成,所有ID的生成策略就是加了一个IDGenerator,用Sequence来实现这个自增序列。
3、用Hibernate显得很高端。我问过好多人,项目持久层是用什么做的,他们很骄傲的说Hibernate,然后我问有没有在实体里面实现一对多和多对一的关联关系,然后他们说没有。Hibernate的核心价值就是关联关系,既然没有用,那Hibernate得唯一用途就是简化增删改,并没有起太大作用。
所以现在好多项目基本上不怎么用Hibernate了,主要是学习成本太高,一般人不容易驾驭,如果项目很小,为了快速开发,那可以用Hibernate,如果项目很复杂, 有性能要求,那就最好不要用。
下面说说mybatis吧,这个前身是ibatis,更新比较慢,最新的更新也仅仅是加入了注解,支持通过注解来完成sql的封装,意义不是很大。mybatis的核心是实体的映射和动态sql,优势还是有的,而且互联网公司用的还比较多,好多项目都是ssm框架了。但是通过我的使用,我发现mybatis依然存在不少问题,首先是xml的配置问题,出问题很难发现,尤其是项目里面好多xml的mapper配置文件,如果当中有一个出错了,那就使劲找问题吧,因为报错的地方往往不是那个文件,最后快崩溃才找到原因。第二是动态sql,尤其是拼oracle分页时,尤其复杂,oracle的分页语句不同于mysql,需要两层嵌套,再加入动态查询条件,非常复杂的,最终的可读性就比较低。
再说JDBCTemplate,这也是spring全家桶里面的,基本和mybatis类似,实现的主要功能就是实体和sql的映射,代码写不了几句就能完成大多数dao层的操作,最主要的原因就是能很清晰的看到sql,非常利于开发人员调试。现在市面上比较多的也就是mybatis和JDBCTemplate的比较,有些争议,这个没有定论,哪个熟悉,哪个顺手用哪个,不要套上效率低的帽子,这俩效率基本一致。反正我现在清一色的JDBCTemplate,方便调试sql。
Spring
最后是spring,这个目前没有太多的选择,而且也没有人去质疑该不该用spring。记得在2005年时,好多人还在争论用不用EJB2,后来又除了EJB3,这俩东西我都用过,确实是庞然大物,里面的配置依赖无比繁琐,层层嵌套,想精通这东西确实很难。而且这个加了一个E在里面,就是Enterprise,企业家开发采用的了这东西,普通的小系统根本就别想碰这个。Spring当初的定位是轻量级的开发容器,后来随着Spring用的人越来越多,EJB发现自己根本不是Spring的对手,没有市场了。时至今日,也基本都是Spring在主导这一块,有些独孤求败的意思,很孤独的存在,一直在领跑, 从未被超越。
Spring一统天下的好处是多多的,社区活跃,大牛数不胜数,对Spring体系的贡献也非常多,所以一开始的Spring核心IOC+AOP也慢慢扩展了,包括整合JPA、redis、mongodb、rest、rabbitmq等等,都可以通过spring很简单的整合进来。反正我是受益良多,不用自己写好多代码来保证稳定性。
行了, 上面三个说完就是谈的最多的,整合了,SSH、SSM、SSH2等各种提法,都没有问题,都是成熟的企业开发框架,只要适合团队,能快速开发调试,就是没问题的。我现在提倡的是全Spring系列,即Spring+SpringMVC+JDBCTemplate,不依赖外部,自己实现。这只是建议,具体好坏自己体验便知。