<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /> 
回来了……<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

项目初定的用EXT+DWRStruts)Spring+Hibernate框架来写,需要准备的知识很多。首先从Spring开始吧,一个个来,会把它们全高清楚的。不说这么多了,开始吧……

首先了解概念、术语:

1.何谓Spring

Spring是个一个全方位的应用程序框架(Application framework),它是实现IOC(Inversion of Control)容器和非侵入性的框架,并提供AOP(Aspect-oriented programming)概念的实现方式。

此外,提供Persistence, Transaction的支持,MVC的实现方式,对于现存的各种框架(strutsJSF, Hibernate等),Spring也提供了与它们相整合的方案。

2.轻量级(Lightweight

相对于一些重量级的容器(如EJB容器)来说的,spring核心包在文件容量上只有不到1MB。轻量级致力于用更简单、更易于管理的方式提供更多的“即开即用”的J2EE服务,尽量隐藏框架本身,使开发者首先使用POJO而不是EJB.

3.非侵入性(NO intrusive

使框架与应用程序向分离,应用程序不使用SpringAPI,保证应用程序的独立性,提供程序组件的复用性。

4.容器(container

容器可以管理对象的生成、资源的取得、销毁等生命周期,甚至建立对象与对象之间的依赖关系。只要容器启动,就能方便获得容器中的实例。

5Inversion of Control Dependency injection

Inversion of Control 翻译成“控制反转”显得有些牵强,更好的理解应为:依赖关系的转移,依赖于抽象而非实践,IOC可以避免对象之间的耦合,避免应用程序依赖于容器的功能,从而脱离容器。

Example: 你可能会这样写出这样的程序,如图

11

 本例中,直接在高层应用中调用底层模块API,导致应用程序对底层模块产生依赖。如果现在要把数据存在USB磁盘,则这个程序将无法使用。

为了“解耦”,实现依赖关系的转移,定义接口:

 

 public interface IDeviceWriter {
       public void saveToDevice();
}
程序不应依赖于实现,而是应依赖于抽象的接口,定义Business类,遇到存档时让其依赖于IDeviceWriter,而不是FloppyWriter.
public class Business {
       private IDeviceWriter writer;
      public void setDeviceWriter(IDeviceWriter writer) {
              this.writer = writer;
       }
       public IDeviceWriter getDeviceWriter() {
              return writer;
       }
       public void save() {
              if(writer == null) {
                     throw new RuntimeException("DeviceWriter needed...");
              }
              writer.saveToDevice();
       }
}

 

接着定义IDevieceWriter的具体实现,如FloppyWriter,(UsbDiskWrter 类似)
public class FloppyWriter implements IDeviceWriter {
       public void saveToDevice() {
              System.out.println("储存至软盘...");
       }
}
则修改后的的程序模型变为:
从图中可以看出,应用程序与具体实现成功解耦,具体调用生什么实现由配置文件决定。
 
6AOP(Aspect-oriented Programming)

简单理解就是,在不修改原程序代码的前提下,为原程序提供更多的功能。例如:某个运用程序有Logging的需求,你可以不修改任何一行代码,加入或者移除这个需求,(当然需要修改配置文件)。

7、依赖注入(Dependency Injection)

意义:保留抽象的接口,让组件(Compoment)来继承抽象接口,当组件要与其它实际对象发生依赖关系时,由抽象接口来注入实际对象。 依赖注入一般有以下三种形式:

1)、通过setXXX()方法来注入所依赖的对象。

2)、在构造方法中(constructor)中注入依赖关系。类似与setXXX方法,一般在调用构造函数时传入依赖对象。

3)Interface injection,接口定义位于容器API,使用时要求实现接口,具有较强的侵入性,降低组件的可重用性,不推荐使用。

  
  声明:学习笔记中的源代码,及相关知识均来自《Spring2.0技术手册》林信良 2007),仅供学习交流,请勿它用