>>分享Java编程技术,对《Java面向对象编程》等书籍提供技术支持 书籍支持  卫琴直播  品书摘要  在线测试  资源下载  联系我们
发表一个新主题 开启一个新投票 回复文章 您是本文章第 26835 个阅读者 刷新本主题
 * 贴子主题:  在Java开源王国中自由翱翔--理清基本的Java编程思想 回复文章 点赞(0)  收藏  
作者:sunweiqin    发表时间:2016-09-27 16:35:51     消息  查看  搜索  好友  邮件  复制  引用

在Java开源王国中自由翱翔--理清基本的Java编程思想

目录

1.1  Java的主流技术的发展            
1.2 主要Java软件的种类            
1.3  创造Java绚丽世界的核心思想            
1.3.1  接口与实现            
1.3.2  封装与抽象            
1.3.3  继承与扩展            
1.3.4  对象的生命周期            
1.4  集成开源软件的基本步骤            
1.5  初学者学习Java的次第            

在如今的Java领域,各种新技术,新工具层出不穷,一方面,每一种技术都会不停地升级换代,另一方面,还会不断涌现出新的技术和工具。Java世界就像小时候玩的万花筒,尽管实质上只是由几个普通的玻璃碎片组成,但只要轻轻一摇,就会变化出千万种缤纷的图案。Java世界如此变化多端,很容易让初学Java的人有无从下手的感觉。常常会有读者问我这样的问题:


我学了Java已经一年多了,现在就只能写点简单的程序,其它的东西实在太多了,我整天学都学不完,很迷惘,不知道该如何有针对性地去学,去找到一份Java工作,现在是困死在Java里了。

撰写本文,目的是为了帮助读者看清Java万花筒的本质,从复杂的表象中寻找普遍的规律,只有掌握了普遍的规律,才能以不变应万变,轻轻松松地把握Java技术发展的新趋势,迅速领略并且会熟练运用一门新的技术,而不成为被动的追随者,知其然而不知其所以然。

本文的参考书籍是《Java面向对象编程》、《Java网络编程核心技术详解》和《Tomcat与JavaWeb开发技术详解》。

1.1  Java的主流技术的发展

在寻找普遍规律之前,让我们先看看Java的发展历程:
  •               GUI界面:Java AWT API--〉Java Swing API
  •              Java Web:Servlet--〉JSP--〉Struts和Spring框架
  •              持久化层:JDBC--〉CMP EJB或BMP EJB--〉Hibernate,MyBatis, JPA --〉Spring框架
  •              分布式应用:Socket--〉RMI--〉JavaEE或Java Web Service
  •              大数据处理:Hadoop以及在此基础上产生的各种软件

1.2 主要Java软件的种类

Java软件琳琅满目,日新月异。对于初学者,无需精通每个软件的用法,只要先对Java领域的软件掌握大致的概貌,接下来在开发软件应用时,需要用到什么软件,就专攻这类软件的用法。
  •              Java Web容器:Tomcat、Resin
  •               EJB容器:Jboss、Weblogic、Webshpere
  •               框架: Java Web框架(Struts,Spring MVC)、业务逻辑层框架(Spring)
  •               持久化层:DAO、ORM映射工具(如Hibernate、MyBatis)、JPA
  •               工程管理工具:ANT、Eclipse、Maven
  •               日志输出工具:
                     a)             Apache Commons Logging(Jakarta Commons Logging,JCL)
                     b)             Simple Logging Facade for Java (SLF4J)
                     c)             Apache Log4j(Log4j2)
                     d)             Java Logging API(JUL)
  •               Java Web服务:Apache Axis2、Apache CXF、Xfire
  •               大数据处理软件:Hadoop、Spark、Apache Hive、Hbase等

1.3  创造Java绚丽世界的核心思想

促成Java世界如此绚丽多姿的基本动力在于以下核心思想。

1.3.1  接口与实现

不同的软件系统之间通过接口来交互。软件系统只对外公开接口,封装实现细节。接口描述了软件系统具备的功能,也就是指定软件系统能够做什么,但是没有指明怎么去做。接口具有三大作用:
(1)对于接口制订者:Oracle公司(原先的SUN公司)通过定义接口,来制定新的软件系统的规范,例如Servlet规范、EJB规范、JPA规范和JWS规范,这些规范主要以接口的形式描述了软件系统必须具备的功能。通过制定规范,Oracle公司指引着Java技术的发展方向,同时给接口的实现者提供了自由发挥的广阔空间。
(2)对于接口实现者:接口实现者以特定的方式实现标准的规范。例如一些开放源代码软件,如Tomcat和Resin分别以不同的实现方式,实现了标准的Servlet规范。同一个接口允许有多种实现,使得Java领域保持着百花齐放、百家争鸣的良好势头。
(3)对于接口调用者:接口调用者的程序具有良好的可移植性。以Java Web应用为例,由于Tomcat和Resin遵守同样的规范,因此用户开发的Java Web应用能够顺利地从Tomcat容器移植到Resin容器中。

1.3.2  封装与抽象

封装指的是在一个大系统中包含一个小系统,大系统是建立在已有小系统的基础上的更为复杂、功能更强大的系统。例如,Hibernate对JDBC API进行了封装,在Hibernate内部依赖JDBC API来操纵数据库,但是Hibernate API比JDBC API具有更强大的功能,例如JDBC API只具有连接和操纵数据库的功能,而Hibernate不仅具备这一功能,还具有对象-关系映射的功能。

抽象是指从已经存在的具有相似功能、但不同接口的系统中抽取共性,提炼出统一的接口。例如,Hibernate Transaction API是对JDBC Transaction API和Java Transaction API(JTA)的抽象。 

再例如现在运用最广泛的Spring框架就像八爪鱼,触角伸到了软件应用的各个层面,Spring在持久化层整合了Hibernate和MyBatis等ORM软件,在Java Web层提供了Spring MVC框架,在Java Web服务层整合了Apache CXF。通过封装和整合,使得Spring自身的功用越来越强大,并且为应用程序提供了统一的Spring API。

1.3.3  继承与扩展

继承与扩展是一对孪生兄弟,当两个类之间存在继承关系,那么必定也存在扩展关系。继承的优点在于提高代码的可重用性,子类会继承父类的所有public和protected类型的属性和方法,在子类的程序代码中,无需重复定义这些属性和方法。扩展的优点在于使软件应用具有可伸缩性,能够在已有功能的基础上扩展新的功能。

Struts框架作为Java Web应用的框架充分运用了扩展思想。Struts框架中的许多类都是供应用程序扩展的,其中最主要的一个是Action类,在Action类中已经定义了一些通用的方法,采用Struts框架的JavaWeb应用将扩展Action类,创建负责特定流程或业务的客户化的Action类。

1.3.4  对象的生命周期

当一个对象通过new语句创建后,它就会拥有一块固定的内存空间,如果没有任何变量引用它,它就会结束生命周期,它占用的内存空间随时可能被JVM的垃圾回收器回收。

应用程序如何管理对象的生命周期呢?目前比较流行的做法是把对象存放在一个“范围”内。例如在Java Web应用中,JavaBean可以存放在request、session或application范围内。每个范围对应一个对象,例如request范围对应HttpServletRequest对象,session范围对应HttpSession对象,application范围对应ServletContext对象。把一个JavaBean存放在request范围内,实质上是在HttpServletRequest对象的一个集合属性中加入这个JavaBean的引用,这个集合属性也被称为HttpServletRequest对象的缓存。
把一个JavaBean存放在request范围内,等价于以下两种说法:
  •              把一个JavaBean加入到HttpServletRequest对象的缓存中
  •               把一个JavaBean和HttpServletRequest对象关联
当JavaBean位于request范围内,这个JavaBean的生命周期依赖于HttpServletRequest对象的生命周期,当HttpServletRequest对象结束生命周期,并且这个JavaBean也不被应用程序中的其他变量引用,那么它就会结束生命周期。

那么HttpServletRequest对象本身的生命周期由谁管理呢?这是由JavaWeb容器(也称Servlet容器)来管理的。对于每个HTTP请求,JavaWeb容器会自动创建一个HttpServletRequest对象,当HTTP请求的响应完毕,JavaWeb容器就会结束这个对象的生命周期。同理,当每个HTTP会话开始,JavaWeb容器会自动创建一个HttpSession对象,当这个会话结束,JavaWeb容器就会结束这个对象的生命周期;当每个JavaWeb应用启动时,JavaWeb容器会自动创建一个ServletContext对象,当这个应用被关闭,JavaWeb容器就会结束这个对象的生命周期。

在Hibernate中,在Session范围内加入一个持久化对象,实质上是在Session对象的集合属性中加入这个持久化对象的引用。以下几种说法是等价的:
  •              在Session范围内加入一个持久化对象
  •               在Session的缓存中加入一个持久化对象
  •               把一个持久化对象与Session关联
值得注意的是,Hibernate的Session不仅能管理缓存中持久化对象的生命周期,还会负责按照持久化对象的状态的变化,来同步更新数据库。

1.4  集成开源软件的基本步骤

在开发Java应用时,为了提高开发效率,缩短开发周期,常常需要集成第三方提供的Java软件,如ORM映射工具Hibernate、MVC框架Struts或Spring MVC、日志工具Log4J和Web服务软件Apache AXIS等。在自己的应用中集成这些第三方软件时,大体步骤都很相似。
(1) 把它们的JAR文件拷贝到classpath中。
(2) 创建它们的配置文件(XML格式的文件或者Java属性文件),这些配置文件通常也位于classpath中。
(3) 在程序中访问它们的接口。

接口与配置文件,是软件系统对外公开的两个主要窗口。无论是Spring、Tomcat、Struts还是Hibernate,都离不开配置文件,与编写程序代码相比,配置文件能提高软件的可维护性,更加灵活的适应用户变化的需求,但是,配置文件不擅长表达非常复杂的逻辑,在这种情况下,必须求助于程序代码。作为软件使用者,如果仅仅想快速掌握一个新的Java软件的使用方法,而不打算深入了解软件内在原理和结构,无非就是了解它的接口以及配置文件的使用方法。当然,如果想对软件的运用达到得心应手的地步,还应该了解软件本身的实现原理和结构,而这些软件无非就是通过抽象、封装和实现等手段,从简单的小系统出发,构造出更加复杂,但是对外有着简洁统一的接口的大系统。

当一个应用程序依赖越来越多的第三方软件时,需要下载大量的第三方软件的类库,这回带来以下问题:
  •              第三方软件的下载地址会经常发生变更,因此从网上下载软件比较麻烦。
  •               软件的版本不断更新,API不断变化,要找到和应用程序匹配的版本比较麻烦。
  •               不同软件的类库中如果存在同包同名的类,会造成冲突。
为了解决以上问题,可以用Maven来管理应用程序,Maven负责对应用程序所依赖的类库进行统一管理,解决所依赖类库的下载、版本匹配和类库之间的冲突问题。

1.5  初学者学习Java的次第

对于Java初学者,如果希望日后成为一名Java开发的高手,首先要掌握Java编程的基本功,不能如蜻蜓点水般大致有数就裹足不前。在这个阶段,可以通过专项的编程题训练,来精通Java编程语法,保证自己会熟练地编写和编译程序。遇到编译错误时,应该能迅速找到程序中的错误并进行修正。

接下来,进一步学习创建实用Java软件或分布式框架所需掌握的知识,包括多线程、套接字、数据库访问、序列化、RMI等技术。了解了这些技术后,不仅自己的编程功力又显著提高,而且会更容易地去掌握一些现成的Java软件的组成原理和用法。

最后,需要根据实际开发需求,去掌握一些框架软件或服务器软件的用法。例如,如果是开发一个Java Web应用,就需要了解Tomcat的使用和配置方法,还需要掌握Spring MVC或Struts框架的用法,假如是通过ORM来访问数据库,则要掌握Hibernate API、MyBatis API或JPA API的用法。

作者:孙卫琴
更新:2020/3/26



[这个贴子最后由 sunweiqin 在 2020-03-27 11:53:00 重新编辑]
  Java面向对象编程-->内部类
  JavaWeb开发-->JavaWeb应用入门(Ⅱ)
  JSP与Hibernate开发-->通过JPA API检索数据
  Java网络编程-->用Spring整合CXF发布Web服务
  精通Spring-->Vue组件开发基础
  Vue3开发-->虚拟DOM和render()函数
  求素数
  面向对象的七大原则,你知道几个?
  [讨论]书中多线程章节的图示有误?
  JDBC API中的桥接模式
  面试官刁难:Java字符串可以引用传递吗?
  小数在内存中是如何存储的?
  Java中的受查异常与非受查异常区别
  Java多线程volatile详解
  Java入门实用代码:获取本机IP地址及主机名
  Java入门实用代码:List 循环移动元素
  Java 入门实用代码:汉诺塔算法
  Java判断一个字符是否为中文字符
  jdbc连接各种数据库代码
  Java线程实现龟兔赛跑
  native2ascii.exe 的Java实现类
  更多...
 IPIP: 已设置保密
楼主      
1页 0条记录 当前第1
发表一个新主题 开启一个新投票 回复文章


中文版权所有: JavaThinker技术网站 Copyright 2016-2026 沪ICP备16029593号-2
荟萃Java程序员智慧的结晶,分享交流Java前沿技术。  联系我们
如有技术文章涉及侵权,请与本站管理员联系。