免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 755 | 回复: 0
打印 上一主题 下一主题

了解spring [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-06-15 01:11 |只看该作者 |倒序浏览

先进的开发框架—理解什么是Spring
最近研究Spring,她包含的编程思想让我耳目一新。所以写下这篇入门级文章供新手参考。我不是什么Spring的资深研究人员,我只是现学 现卖。所以文章也只能是肤浅单薄,错误难免,还请见谅。
一、    Spring诞生
Spring是一个开源框架,目前 在开源社区的人气很旺,被认为是最有前途的开源框架之一。她是由Rod Johnson创建的,她的诞生是为了简化企业级系统的开发。说道 Spring就不得不说EJB,因为Spring在某种意义上是EJB的替代品,她是一种轻量级的容器。用过EJB的人都知道EJB很复杂,为了一个简单的功 能你不得不编写多个Java文件和部署文件,他是一种重量级的容器。也许你不了解EJB,你可能对“轻(重)量级”和“容器”比较陌生,那么 这里我简单介绍一下。
1、什么是容器
“容器”,这个概念困扰我好久。从学习Tomcat开始就一直对此感到困惑。感性的来讲,容器就 是可以用来装东西的物品。那么在编程领域就是指用来装对象(OO的思想,如果你连OO都不了解,建议你去学习OO先)的对象。然而这个对象 比较特别,它不仅要容纳其他对象,还要维护各个对象之间的关系。这么讲可能还是太抽象,来看一个简单的例子:
代码片断1:
  • public class Container   
  • {  
  •     public void init()  
  •     {  
  •     Speaker s = new Speaker();  
  •     Greeting g = new Greeting(s);  
  •     }  
  • }  
    可以看到这里的Container类(容器)在初始化的时候会生成一个Speaker对 象和一个Greeting对象,并且维持了它们的关系,当系统要用这些对象的时候,直接问容器要就可以了。这就是容器最基本的功能,维护系统 中的实例(对象)。如果到这里你还是感到模糊的话,别担心,我后面还会有相关的解释。
    2、轻量级与重量级
    所谓“重量级”是 相对于“轻量级”来讲的,也可以说“轻量级”是相对于重量级来讲的。在Spring出现之前,企业级开发一般都采用EJB,因为它提供的事务管 理,声明式事务支持,持久化,分布计算等等都“简化”了企业级应用的开发。我这里的“简化”打了双引号,因为这是相对的。重量级容器 是一种入侵式的,也就是说你要用EJB提供的功能就必须在你的代码中体现出来你使用的是EJB,比如继承一个接口,声明一个成员变量。这样 就把你的代码绑定在EJB技术上了,而且EJB需要JBOSS这样的容器支持,所以称之为“重量级”。
    相对而言“轻量级”就是非入侵式的,用 Spring开发的系统中的类不需要依赖Spring中的类,不需要容器支持(当然Spring本身是一个容器),而且Spring的大小和运行开支都很微量 。一般来说,如果系统不需要分布计算或者声明式事务支持那么Spring是一个更好的选择。
    二、    几个核心 概念
    在我看来Spring的核心就是两个概念,反向控制(IoC),面向切面编程(AOP)。还有一个相关的概念是POJO,我也会略带介绍。
    1、POJO
    我所看到过的POJO全称有两个,Plain Ordinary Java Object,Plain Old Java Object, 两个差不多,意思都是普通的Java类,所以也不用去管谁对谁错。POJO可以看做是简单的JavaBean(具有一系列Getter,Setter方法的类)。 严格区分这里面的概念没有太大意义,了解一下就行。
    2、    IoC
    IoC的全称是 Inversion of Control,中文翻译反向控制或者逆向控制。这里的反向是相对EJB来讲的。EJB使用JNDI来查找需要的对象,是主动 的,而Spring是把依赖的对象注入给相应的类(这里涉及到另外一个概念“依赖注入”,稍后解释),是被动的,所以称之为“反向”。先看 一段代码,这里的区别就很容易理解了。
    代码片段2:
  • public void greet()  
  • {  
  • Speaker s = new Speaker();  
  • s.sayHello();  
  • }  
    代码片段3:
  • public void greet()  
  • {  
  • Speaker s = (Speaker)context.lookup("ejb/Speaker");  
  • s.sayHello();  
  • }  
    代码片段4:
  • public class Greeting   
  • {  
  •     public Speaker s;  
  •     public Greeting(Speaker s)  
  •     {  
  •         this.s = s;  
  •     }  
  •     public void greet()  
  •     {  
  •         s.sayHello();  
  •     }  
  • }
    我们可以对比一下这三段代码。其中片段2是不用容器的编码,片段3是EJB编码,片段4是Spring编码。结合代码片段1,你能看出来 Spring编码的优越之处吗?也许你会觉得Spring的编码是最复杂的。不过没关系,我在后面会解释Spring编码的好处。
    这里我想先解释一 下“依赖注入”。根据我给的例子可以看出,Greeting类依赖Speaker类。片段2和片段3都是主动的去获取Speaker,虽然获取的方式不同。但 是片段4并没有去获取或者实例化Speaker类,而是在greeting函数中直接使用了s。你也许很容易就发现了,在构造函数中有一个s被注入(可 能你平时用的是,传入)。在哪里注入的呢?请回头看一下代码片段1,这就是使用容器的好处,由容器来维护各个类之间的依赖关系(一般通 过Setter来注入依赖,而不是构造函数,我这里是为了简化示例代码)。Greeting并不需要关心Speaker是哪里来的或是从哪里获得Speaker, 只需要关注自己分内的事情,也就是让Speaker说一句问候的话。
    3、    AOP
    AOP全称是Aspect- Oriented Programming,中文翻译是面向方面的编程或者面向切面的编程。你应该熟悉面向过程的编程,面向对象的编程,但是面向切面 的编程你也许是第一次听说。其实这些概念听起来很玄,说到底也就是一句话的事情。
    现在的系统往往强调减小模块之间的耦合度,AOP技 术就是用来帮助实现这一目标的。举例来说,假如上文的Greeting系统含有日志模块,安全模块,事务管理模块,那么每一次greet的时候,都 会有这三个模块参与,以日志模块为例,每次greet之后,都要记录下greet的内容。而对于Speaker或者Greeting对象来说,它们并不知道自己 的行为被记录下来了,它们还是像以前一样的工作,并没有任何区别。只是容器控制了日志行为。如果这里你有点糊涂,没关系,等讲到具体 Spring配置和实现的时候你就明白了。
    假如我们现在为Greeting系统加入一个Valediction功能,那么AOP模式的系统结构如下:
    G|RET|TIN|G
    V|ALE|DIT|ION
    |   |   |
    日志 安全 事务
    这些模块是贯穿 在整个系统中的,为系统的不同的功能提供服务,可以称每个模块是一个“切面”。其实“切面”是一种抽象,把系统不同部分的公共行为抽 取出来形成一个独立的模块,并且在适当的地方(也就是切入点,后文会解释)把这些被抽取出来的功能再插入系统的不同部分。
    从某种 角度上来讲“切面”是一个非常形象的描述,它好像在系统的功能之上横切一刀,要想让系统的功能继续,就必须先过了这个切面。这些切面 监视并拦截系统的行为,在某些(被指定的)行为执行之前或之后执行一些附加的任务(比如记录日志)。而系统的功能流程(比如Greeting )并不知道这些切面的存在,更不依赖于这些切面,这样就降低了系统模块之间的耦合度。
    转载


    本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/39783/showart_321665.html
  • 您需要登录后才可以回帖 登录 | 注册

    本版积分规则 发表回复

      

    北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
    未成年举报专区
    中国互联网协会会员  联系我们:huangweiwei@itpub.net
    感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

    清除 Cookies - ChinaUnix - Archiver - WAP - TOP