Java小白到大神的心路历程(框架)

本文是“Java心路历程”的第四篇,前三篇请戳:

1.Java小白到大神的心路历程(Java SE)

2.Java小白到大神的心路历程(Web前端)

3.Java小白到大神的心路历程(数据库)

    每一个javaer,都对“开源框架”又爱又恨。爱她,因为她封装了大量的底层代码,可以帮助我们简化代码量;恨她,因为她“太善变”了,以“访问数据库为例”,一会是JDBC、一会是hibernate、一会是mybatis,一会又可能是Spring Data+JPA。因此,常听到有人调侃,“软件技术的更新速度,远大于个人的学习速度”。

    本文,重点介绍的是初学者在学习“开源框架”时,可能经历的心路历程。

    开源框架难吗?相信大部分初学者,都觉得她难。但希望你仔细思考一下“开源框架”的产生目的是什么?她是为了简化代码而生,是为了提高性能而生,是为了提高安全性而生。简言之,如果不用框架,我们完全能够实现所有的功能。

    那么问题来了,既然框架又难、并且不用她也可以,为什么还要学?而且还要没完没了的学下去?

(可以将这个问题,细化为2个问题。1:框架难吗?2:能否不用框架,自己用底层技术实现类似功能?)

   先说第一个问题“开源框架难吗?”。其实,不难。我认为,很多人觉得“难”的原因,是自己对基础的学习,不够牢固。简言之,你对基础掌握的越好,学习框架就会越轻松,甚至慢慢成为一种乐趣(成就感);反之,基础较差的同学,在学习框架时简直就是一种折磨。

     下面举个例子,你就明白了。例如,在基础学习阶段,大家都应该学习过Servlet。Servlet2.x需要通过xml配置映射关系、Servlet3.x是通过注解配置的。具体的,在处理阶段,一端发出request请求,另一端接收;并且在请求和接收请求时,需要遵循一定的规则。例如,如果一端是通过超链接发起的请求,另一端就需要根据请求路径接收请求,并且通过request.getParameter()来接收请求参数。而如果一端的请求里,携带了10个参数,另一端(接收端)就得用同样的方法接收10次。显然,这么做太复杂,而且有点不符合面向对象的思想。因为,如果发出的10个参数正好是同一个对象的10个属性,最好能在接收方,直接将这10个参数封自动装到一个对象中,然后直接处理就行,如图。

    好,既然我们能想到用“封装对象”的方法来简化代码,聪明的各大三方平台也肯定能想到。因此,各种简化方式就来了,如下:

1.Struts2说:如果你传递的多个值,正好是Person对象的各个属性,那就需要建立一个Person类;然后再来一个PersonAction类,把Person对象作为PersonAction的成员。只要你遵循这种约定,剩下的就交给我来处理,保证程序正常运行。

public class PersonAction {
     private Person person;
     ...
}

2SpringMVC说:Struts2那样做太麻烦,看我的。在我这里,你直接可以用Person对象作为方法的参数,其余你就不操心了,我会将前面发送的多个参数 自动帮你封装到这个方法参数里,如下。

@RequestMapping("...")
//前端发来的多个参数,会自动封装在参数student里
public String entityProperties(Student student)
{
    System.out.println(student);
    return "success";
}

    也就是说,对于“如何将多个离散的值,封装到一个对象中”这个问题,不同的机构有着不同的理解,因此就产生了不同的框架。这就好比 在学校时,老师提出了一个问题,之后同学A说:“老师,我觉得应该这么做……”,于是框架A产生了;过了一阵子后,同学B说“老师,A那么做太麻烦了,我有个更简单的办法,……”于是框架B产生了。但重点是:不论是A框架,还是B框架,他们的底层原理必然是一致的,一定是遵循着四则运算或九九乘法表等基本规律。

      同样的道理,不论是Struts2还是SpringMVC,不论他们怎么封装,核心思想也仅仅是将离散的值 封装到一个对象里而已,这点和new Person(id,name,age,address...)的功能没有区别。此外,不论是什么框架,他们在处理映射时,要么是通过xml配置,要么是通过注解设置,而这两种方式在Servlet2.x和Servlet3.x中都有体现。

      既然框架这么简单,但为什么总是记不住,还老觉得框架难呢?我认为,可能是思维方式出了问题。在学习基础知识(例如Servlet)时,一般老师都会认为你是小白、觉得你什么都不懂,是完全在第一次学习,因此都会详细的给你讲解它的来龙去脉和理论知识。但当讲到SpringMVC等框架时,老师(或者写书的人)会认为你已经不是初学了,觉得你既然已经学习过Servlet,那么学习SpringMVC应该不需要再过多的讲解它是如何封装、它的底层到底是怎么运转的了。因此,此时你的学习路线应该是:回忆旧知识+学习新知识。但如果你的“旧知识”都还没搞明白,框架的学习必然会有很大困难。

       此外,还有一部分初学者,在学习框架时靠的是“背诵、记忆”。然而,先不讨论你能不能记住、你能记多久,即使你拥有超强大脑,但一旦技术升级或API更新时,你的记忆将毫无意义。因此,理解和思想才是王道。

    再说说前面提到的第二个问题,“能否不用框架,自己用底层技术实现类似功能?”。可以,但你至少得是架构师,并且有大量的空闲时间。框架的目的在于“简化”,可以让我们将注意力集中在业务本身上,而不用过多的去思考其他因素。举个例子,在使用SpringMVC时,你只需要关注如何做好映射处理、如何传递参数,基本就差不多了,其余都是由框架来搞定。但如果你真的想写一个自己的SpringMVC出来,就不是这么简单了。你需要考虑线程并发问题、跨域问题、安全性问题、扩展性、RPC、序列化反序列化等各种问题。可见,框架是将那些你“看不见”的问题都处理好了,并且实现了大量的“简化”功能,你需要做的,就是根据框架的API填空而已。

     总结一下。学好框架的前提是,你必须已经掌握了相应的底层技术。例如要学习SpringMVC,你得学深入掌握了Servlet;要学习MyBatis,你必须对JDBC已经非常熟悉……

      还有就是,远离负能力量,远离那些教你“Xxx已经过时了,直接学某某框架”的人。

- 完 -

推荐阅读

答疑 | 高并发都要学哪些技术?

答疑 | 我是JAVA初级,有必要学架构设计吗?

Java小白到大神的心路历程(Java SE)

答疑 | 面试全对,却没offer?

答疑 | 背下这300字,面试就能加薪!

猜你喜欢

转载自blog.csdn.net/yanqun007/article/details/106279881