分类: Java
2008-03-17 11:26:55
一,Spring简介
Spring的特点:
1, Spring不同于其他的Framework,它要提供的是一种管理你的业务对象的方法。
2, Spring有分层的体系结构,意味着你能选择仅仅使用它的任何一个独立的部分,而其他的仍然使用你的相关实现。
3, 它的设计从一开始就是要帮助你编写易于测试的代码,Spring是使用测试驱动开发(TDD)的工程的理想框架。
4, Spring不会给你的工程添加对其他的框架依赖;同时Spring又可以称得上是个一揽子解决方案,提供了一个典型应用所需要的大部分基础架构。
Spring的好处:
1, Spring能有效地组织你的中间层对象;(*)
2, Spring能消除在许多工程中常见的对Singleton的过多使用;
3, 通过一种在不同应用程序和项目间一致的方法来处理配置文件,消除各种自定义格式的属性文件的需要,仅仅需要看看类的JavaBean属性。Inversion of Control的使用帮助完成了这种简化;(使用的是type2的IoC)
4, 能够很容易培养你面向接口而不是面向类的编程习惯。(这也算。。。)
5, Spring的设计会让使用它创建的应用尽可能少的依赖于它的APIs,在Spring应用中的大多数业务对象没有依赖于Spring。
6, 使用Spring构建的应用程序易于单元测试;
7, Spring使EJB成为一个实现选择,而不是必需的选择。你可以用POJOs或local EJBs来实现业务接口,却不会影响到调用代码。
8, Spring提供一些web应用上的EJB的替代方案,比如用AOP提供声明性事务管理;
9, Spring为数据存取提供了一个一致的框架,不论是使用JDBC还是O/R mapping的产品(Hibernate,JDO)。
Spring的任务描述:
Spring的主要目的就是使J2EE易用和促进良好的编程习惯。
Spring不会重新发明轮子,它是让已有的技术更加易用,比如它没有底层事务协调处理,但是提供了一个抽象层覆盖了JTA和任何其他的事物策略。Spring并没有和其他的开源项目竞争,不过还是在一些领域有新的方案提供,比如它的web framework,轻量级的IoC容器和AOP框架。
二,Inversion of Control容器
Spring的设计核心是org.springframework.beans包,用来协调JavaBeans的工作。这个包一般不会被用户直接使用,而是作为其他功能的基础服务。
下一个高一些的抽象概念是Bean Factory,一个Spring bean factory是一个可以通过名称来获取objects的通用工厂,并且管理objects之间的关系。
Bean factories支持两种对象模式:
Singleton:默认的,最常使用的,对于无状态的对象是一种理想的模式。
Prototype:每次获取将创建一个独立的对象,可以让用户拥有他们自己的对象。
由于org.springframework.beans.factory.BeanFactory是一个简单的接口,所以你能够方便地实现出你自己的BeanFactory,但是很少用户需要这样做;常用的BeanFactory定义是:
XmlBeanFactory:解析简单直观的定义类和命名对象属性的XML结构;
ListableBeanFactoryImpl:提供了解析存放在属性文件中的bean定义的能力;
通过BeanFactory的概念,Spring成为了一个Inversion of Control容器。IoC背后的概念就是所谓的Hollywood原则:Don’t call me, I ‘ll call you。IoC将控制创建的职责从对象的代码中搬进了框架中,使用IoC容器只需指出组件需要X对象,在运行期容器会提供给它具体的对象。而容器就是通过查看方法的参数表(例如JavaBean的属性),或者通过配置源(XML)来得到相应的信息,从而实现向组件提供对象
Spring ApplicationContext是BeanFactory的子接口,为下列东西提供支持:
信息查找,支持国际化
事件机制,允许发布应用程序以及可选的注册已接受到事件
可移植的文件和资源访问
三,JDBC抽象和数据访问异常层次
JDBC提供了不错的数据库抽象,但是也有痛苦的地方:
需要大量的错误处理代码来确保ResultSet,Statement,Connection在使用后关闭;
没有异常的层次,使用SQLException来响应所有的错误,并不知道具体错在哪里。
Spring用两种方法解决这些问题:
通过API把冗长易出错的异常处理代码从程序转移到框架中,框架处理所有异常,而程序代码集中精力进行SQL和处理结果上;
为要处理SQLException的程序代码提供有意义的异常层次。当Spring第一次从数据源取得一个连接时,它检查元数据以确定数据库,随后它使用这些信息把SQLException映射为自己的异常层次中的响应的异常,是你可以和有意义的异常打交道。
Spring提供两层JDBC API,第一个在org.springframework.jdbc.core包中,使用回调机制移动控制权从程序转移到了框架中,这是一种不同的Inversion of Control。
在org.springframework.jdbc.object包中是对JDBC的更高层次的抽象。这是建立在核心的JDBC回调功能基础之上的,但是提供了一个能够对RDBMS操作的API,在这个API中无论是查询,更新或是存储过程,都是用Java对象来建模。这组API受到了JDO查询API的影响,非常直接而且有用。
Spring数据访问异常层次是基于unchecked exception的,这样开发者可以自己决定是否来捕捉这些异常从而恢复。
Spring JDBC对你带来的好处:
你不必像JDBC那样写finally;
你需要编写的代码变少了;
你不必钻研RDBMS文档去解决理解,一个因为错误的列名而返回的诡异错误码;
不管你使用何种持久化技术,你都可以方便地实现DAO模式,让业务代码不依赖于任何特定的数据访问API。
四,O/R mapping集成
Spring提供了对Hibernate 2.x和JDO的集成支持,尤其是对Hibernate的集成。
为什么要使用Hibernate+Spring,而不是直接使用Hibernate呢?
1, 用Hibernate的代码通常需要为了效率和适当的事务处理而使用相同的Session对象;Spring通过在代码层上使用显式的template包装类或者使用声明式的,AOP的方法拦截(interceptor)方式两种方案,使得能够很容易透明地创建和绑定Session到当前的线程。
2, 资源管理,Spring的应用程序context能够处理Hibernate SessionFactories的位置和配置,JDBC数据源和其他的相关资源;使得易于管理和改变。
3, 集成的事务管理 Spring让你能够把你的Hibernate代码包装起来,通过2种方式:在代码层上使用显式的template包装类,或者使用声明式的,AOP的方法拦截(interceptor)。
4, Spring能够包装Hibernate异常,把它们从私有的,checked异常转换为一套抽象的运行时异常;使得你能够在任何你需要的地方捕捉和处理异常,并且JDBC异常也被转换到相同的层次中,意味着你能在一致的编程模型中对JDBC执行相同的操作。
5, 为了避免和厂商绑定 Hibernate强大,灵活,免费,当时仍然使用私有的API;Spring对Hibernate的事务和异常的抽象,使你很容易将Hibernate-specific代码隔离开你的应用程序部分,而不会影响Hibernate的强大功能。
6, 测试简单 Spring的IoC使它很容易改变Hibernate session factories的位置,数据源,事务管理和映射对象执行,这使得很容易隔离和测试每一块持久关系代码。
五,事务管理
JTA使一个直接用起来很笨重的API,许多J2EE开发者感到EJB CMT使对于事务管理的唯一合理的选择。
Spring提供了它对事务管理的抽象,提供了:
1, 通过类似于JdbcTemplate的回调模板编程管理事务,比起直接用JTA容易多;
2, 类似于EJB CMT的声明式事务管理,但不需要EJB容器;
六,AOP
Spring的AOP支持的首要目标是要给POJOs提供J2EE服务,而且它有能够在应用服务器之间移植的优势,Spring AOP支持method interception,关键概念包括:
Interception:自定义行为能够在对接口和类的调用之前之后插入;
Introduction:指定advice会导致对象实现额外的接口,混乱了继承;
Spring使用动态代理实现AOP或者在运行时使用CGLIB生成字节码(这是的能够代理类)。两种方法都能够在任何应用服务其中使用。
Spring使实现了AOP Alliance接口的AOP框架(在学习AOP中介绍过)。
Spring AOP最常见的应用使声明式事务管理,这是基于前面描述的TransactionTemplate抽象上的,并且可以给任何POJO提供声明式事务管理。
Spring的声明式事务管理类似于EJB CMT,但在以下方面不同:
l 事务管理能够应用于任何POJO;
l 通过使用Spring的事务API能够在事务性POJO中实现编程回掉。为此我们提供静态的方法,使用ThreadLocal变量,因而不需要你传递EJBContext这样的对象确保回滚;
l 你可以声明式地定义“回滚规则”;
l 事务管理不绑定于JTA。
当然你还可以使用Spring AOP实现程序特有的aspects。
请对以上恢复出来的文字进行修改后提交
七,MVC web框架
Spring的MVC model类似于Struts。在多线程服务对象这点上,Spring的Controller类似于Struts Action,只有一个实例处理所有客户请求。
Spring MVC比起Struts的优点:
1, Spring在Controller, JavaBean, model和views提供了一个非常清晰的划分;
2, Spring的MVC是非常灵活的。不像Struts强制你继承它的Action和Form对象,Spring MVC完全是基于接口的;
3, Spring MVC是真正的view无关的。你不会被强制使用JSP
4, 和其他对象一样,Spring的Controller是通过IoC配置的。使它们易于测试;
5, Web层变成了业务对象层上的薄薄一层
八,EJB相关
实现EJB:
如果你选择使用EJB,Spring能在EJB实现和客户端访问EJB两方面都提供很大的好处。
Spring为session bean和message drive bean提供了方便的超类,使得通过自动载入基于包含在EJB jar文件中的XML文档BeanFactory让这变得很容易。
感觉不是很有用的样子。
使用EJB:
许多EJB程序使用Service Locator和Business Delegate模式,这些比在客户代码中使用JDNI查找强多了,但是还是有显著的缺点:
l 使用EJB的典型代码依赖Service Locator或者Business Delegate singletons,难于测试;
l 在Service Locator模式没有使用Business Delegate的情况下,程序代码还要在EJB home重调用create()方法,并且可能导致异常,代码依然绑定在EJB API上;
l 实现Business Delegate模式通常导致显著的代码重复;
我们只需要给需要EJB的Bean定义一个组件,在XML中指定它的jndi name,interface,Spring AOP框架会帮你为EJB创建一个代理,实现了业务方法的接口,缓存EJBHome,代理JNDI查找,调用响应的业务方法。
从而使你的web层代码不依赖于EJB的使用,如果你要使用POJO或其他object代替EJB引用,你只需要改动组件定义xml,而不影响代码。