`
tongchuanwei
  • 浏览: 8848 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
文章分类
社区版块
存档分类
最新评论

java学习笔记7接口& 组件、容器

阅读更多

终于又静下来继续写这个主题的续篇,前六篇主要讲了一些J2se方面的经验和感受, 眼下Java应用范围已经被J2ee占据了相当大的一块领域,有些人甚至声称JavaJ2ee所取代了。不知道大家如何来理解所谓的J2ee (Java2 Enterprise Edition),也就是Java企业级应用?

 

笔者的观点是,技术的发展是顺应世界变化的趋势的,从C/S过渡到B/S模式,从客户端的角度考虑企业级应用或者说电子商务领域不在关心客户端维护问题, 这个任务已经交给了任何一台PC都会有的浏览器去维护;从服务器端的角度考虑,以往C/S中的TCP/IP协议实现载体ServerSocketWeb Server Container所取代,例如大家都很熟悉的TomcatJBossWebLogic等等。总之一切的转变都是为了使得Java技术能更好的为人类 生产生活所服务。

 

有人会问,直接去学J2ee跳过J2se行否?笔者是肯定不赞成的,实际上确实有人走这条路,但笔者自身体会是正是由于J2se的基础很牢固,才会导致在J2ee学习的道路上顺风顺水,知识点上不会有什么迷惑的地方。举个简单的例子吧:

 

笔者曾经跟大学同学讨论下面这两种写法的区别:

ArrayList list = new ArrayList(); //笔者不说反对,但至少不赞成

List list = new ArrayList(); //笔者支持

曾经笔者跟同学争论了几个小时,他非说第一种写法更科学,第二种完全没有必要。我无法完全说服他,但笔者认为良好的习惯和意识是任何时候都应该针对接口编程,以达到解耦合和可扩展性的目的。下面就以接口开始进入J2ee的世界吧:

 

1. J2ee与接口

 

每一个版本的J2ee都对应着一个确定版本的JDKJ2ee1.4对应Jdk1.4,现在比较新的是JDK5.0,自然也会有J2EE 5.0。其实笔者一直在用的是J2EE1.4,不过没什么关系,大家可以下任何一个版本的J2ee api来稍微浏览一下。笔者想先声明一个概念,J2ee也是源自Java,所以底层的操作依然调用到很多J2se的库,所以才建议大家先牢牢掌握J2se 的主流技术。

 

J2ee api有一个特点,大家比较熟悉的几个包java.jmsjavax.servlet.httpjavax.ejb等都以interface居多,实 现类较少。其实大家真正在用的时候百分之六十以上都在反复的查着javax.servlet.http这个包下面几个实现类的api函数,其他的包很少问 津。笔者建议在学习一种技术之前,对整体的框架有一个了解是很有必要的,J2ee旨在通过interface的声明来规范实现的行为,任何第三方的厂商想 要提供自己品牌的实现前提也是遵循这些接口定义的规则。如果在从前J2se学习的道路上对接口的理解很好的话,这里的体会将是非常深刻的,举个简单的例 子:

 

public interface Mp3{

public void play();

public void record();

public void stop();

}

 

如果我定义这个简单的接口,发布出去,规定任何第三方的公司想推出自己的名字为Mp3的产品都必须实现这个接口,也就是至少提供接口中方法的具体实现。这 个意义已经远远不止是面向对象的多态了,只有厂商遵循J2ee的接口定义,世界上的J2ee程序员才能针对统一的接口进行程序设计,最终不用改变代码只是 因为使用了不同厂商的实现类而有不同的特性罢了,本质上说,无论哪一种厂商实现都完成了职责范围内的工作。这个就是笔者想一直强调的,针对接口编程的思 想。

 

接口到底有什么好处呢?我们这样设想,现在有AppleMp3SonyMp3SamsungMp3都实现了这个Mp3的接口,于是都有了play recordstop这三个功能。我们将Mp3产品座位一个组件的时候就不需要知道它的具体实现,只要看到接口定义知道这个对象有3个功能就可以使用 了。那么类似下面这样的业务就完全可以在任何时间从3个品牌扩展到任意个品牌,开个玩笑的说,项目经理高高在上的写完10个接口里的方法声明,然后就丢给 手下的程序员去写里面的细节,由于接口已经统一(即每个方法传入和传出的格式已经统一),经理只需关注全局的业务就可以天天端杯咖啡走来走去了,^_^

public Mp3 create();

public void copy(Mp3 mp3);

public Mp3 getMp3();

 

最后用一个简单的例子说明接口:一个5号电池的手电筒,可以装入任何牌子的5号电池,只要它符合5号电池的规范,装入之后任何看不到是什么牌子,只能感受 到手电筒在完成它的功能。那么生产手电筒的厂商和生产5号电池的厂商就可以完全解除依赖关系,可以各自自由开发自己的产品,因为它们都遵守5号电池应有的 形状、正负极位置等约定。这下大家能对接口多一点体会了么?

 

2. 组件和容器

针对接口是笔者特意强调的J2ee学习之路必备的思想,另外一个就是比较常规的组件和容器的概念了。很多教材和专业网站都说J2EE的核心是一组规范与指 南,强调J2ee的核心概念就是组件+容器,这确实是无可厚非的。随着越来越多的J2ee框架出现,相应的每种框架都一般有与之对应的容器。

 

容器,是用来管理组件行为的一个集合工具,组件的行为包括与外部环境的交互、组件的生命周期、组件之间的合作依赖关系等等。J2ee包含的容器种类大约有 Web容器、Application Client容器、EJB容器、Applet客户端容器等。但在笔者看来,现在容器的概念变得有点模糊了,大家耳熟能详是那些功能强大的开源框架,比如 HibernateStruts2SpringJSF等,其中Hibernate就基于JDBC的基础封装了对事务和会话的管理,大大方便了对数据 库操作的繁琐代码,从这个意义上来说它已经接近容器的概念了,EJB的实体Bean也逐渐被以Hibernate为代表的持久化框架所取代。

 

组件,本意是指可以重用的代码单元,一般代表着一个或者一组可以独立出来的功能模块,在J2ee中组件的种类有很多种,比较常见的是EJB组件、DAO 件、客户端组件或者应用程序组件等,它们有个共同特点是分别会打包成.war.jar.jar.ear,每个组件由特定格式的xml描述符文件进行 描述,而且服务器端的组件都需要被部署到应用服务器上面才能够被使用。

 

稍微理解完组件和容器,还有一个重要的概念就是分层模型,最著名的当然是MVC三层模型。在一个大的工程或项目中,为了让前台和后台各个模块的编程人员能 够同时进行工作提高开发效率,最重要的就是实现层与层之间的耦合关系,许多分层模型的宗旨和开源框架所追求的也就是这样的效果。在笔者看来,一个完整的 Web项目大概有以下几个层次:

 

a) 表示层(JspHtmlJavascriptAjaxFlash等等技术对其支持)

b) 控制层(StrutsJSFWebWork等等框架在基于Servlet的基础上支持,负责把具体的请求数据(有时卸载重新装载)导向适合处理它的模型层对象)

c) 模型层(笔者认为目前最好的框架是Spring,实质就是处理表示层经由控制层转发过来的数据,包含着大量的业务逻辑)

d) 数据层(HibernateJDBCEJB等,由模型层处理完了持久化到数据库中)

 

当然,这仅仅是笔者个人的观点,仅仅是供大家学习做一个参考,如果要实现这些层之间的完全分离,那么一个大的工程,可以仅仅通过增加人手就来完成任务。虽 然《人月神话》中已经很明确的阐述了增加人手并不能是效率增加,很大程度上是因为彼此做的工作有顺序上的依赖关系或者说难度和工作量上的巨大差距。当然理 想状态在真实世界中是不可能达到的,但我们永远应该朝着这个方向去不断努力。最开始所提倡的针对接口来编程,哪怕是小小的细节,写一条List list= = new ArrayList()语句也能体现着处处皆使用接口的思想在里面。Anyway,这只是个开篇,笔者会就自己用过的J2ee技术和框架再细化谈一些经验.

分享到:
评论

相关推荐

    Java学习笔记-个人整理的

    {2.9}抽象与接口}{59}{section.2.9} {2.10}访问控制}{60}{section.2.10} {2.10.1}类的属性}{60}{subsection.2.10.1} {2.10.2}类的方法}{61}{subsection.2.10.2} {2.10.3}静态代码块}{62}{subsection.2.10.3} {...

    Java开发详解.zip

    000000_【课程介绍 —— 写在前面的话】_Java学习概述笔记.pdf 010101_【第1章:JAVA概述及开发环境搭建】_JAVA发展概述笔记.pdf 010102_【第1章:JAVA概述及开发环境搭建】_Java开发环境搭建笔记.pdf 010201_【第2...

    spring项目开发学习笔记

    Spring是一个轻量级的DI/IoC和AOP容器框架。存在的目的是用于构建轻量级的J2EE应用。 轻量级:应用大小和应用开支,包括应用方式 依赖注入DI/IoC控制反转:提供松耦合的一种实现技术 AOP面向切面编程:(可以在不...

    Flex新手教程_入门级学习笔记

    1.9接口 Interface 4 1.10继承 Inheritance 5 2.ActionScript3.0常用类 6 2.1内容现实类 6 2.2 String 6 2.3 Array类 8 2.4 XML和E4X 9 2.5 事件处理 Event 12 2.6异常和错误处理 13 3.Flex组件 15 3.1布局设计 15 ...

    javaee学习笔记.zip

    随着WEB和EJB容器概念诞生,使得软件应用业开始担心SUN的伙伴们是否还在Java平台上不断推出翻新的标准框架,致使软件应用业的业务核心组件架构无所适从,从一直以来是否需要EJB的讨论声中说明了这种彷徨。

    java查看sun包源码-learning-spring:Spring框架讲解

    学习笔记 IOC 和 DI 的概述 IOC(Inversion of Controll) 思想是反转资源获取的方向,传统的资源查找方式要求组件向容器发起请求查找资源。作为回应,容器适时的返回资源。而应用了IOC之后,则是容器主动的将资源推送...

    阿里云javasdk源码-springboot_study:最通俗易懂的SpringBoot经典学习笔记讲解

    阿里云java sdk源码 导读:课程概览 1. Spring Boot是什么 我们知道,从 2002 年开始,Spring 一直在飞速的发展,如今已经成为了在Java EE(Java Enterprise Edition)开发中真正意义上的标准,但是随着技术的发展,...

    springboot学习思维笔记.xmind

    springboot学习笔记 spring基础 Spring概述 Spring的简史 xml配置 注解配置 java配置 Spring概述 Spring的模块 核心容器CoreContainer Spring-Core Spring-Beans ...

    java中solr的笔试题-note:个人学习信息

    个人学习笔记 python nginx AWS认证考试 技术路线 LB负载均衡 负载均衡常见使用场景,问题定位,特别是对于概率性出现的访问超时问题定位。包含如下组件 nginx lvs openresty kong apigateway 消息中间件 对于消息...

    asp.net知识库

    VS2005 ASP.NET本地化学习笔记&感受 在自定义Server Control中捆绑JS文件 Step by Step 深度解析Asp.Net2.0中的Callback机制 使用 Web 标准生成 ASP.NET 2.0 Web 站点 ASP.NET 2.0基于SQLSERVER 2005的aspnetdb.mdf...

    Seldon Core:Kubernetes机器学习部署平台-python

    安装量超过 200 万次,Seldon Core 可用于跨组织管理机器学习模型的大规模部署,主要优势包括: 使用我们的语言包装器或预先打包的推理服务器轻松容器化 ML 模型。 开箱即用的端点,可以通过 Swagg

    spring-demo:Spring框架学习与分析研究,附带可运行的引用示例,创建这个仓库的初衷,是因为网上的内容太碎片化了,我尝试来一个集大成者,在一个地方就能弄清楚所有的问题

    Spring学习笔记 这是一个Spring框架应用示例工程,里面写了大量的注释,对于我们理解和掌握Spring的一些关键特性是非常有帮助的。 这也是我学习和理解Spring的一个过程,分享出来给有这方面需求的同学快速入门,希望...

Global site tag (gtag.js) - Google Analytics