<1> spring学习导读

最近比较闲,把自己的笔记整理下,虽然都是些入门的东西,还是值得以后回味一下。先从spring开始,主要参考《spring in action(第二版)》和网络资料。

Spring是一个开源框架,为简化企业级应用开发应运而生的。

注:框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。框架的最大好处就是重用。
可以说,一个框架是一个可复用的设计构件,它规定了应用的体系结构,阐明了整个设计、协作构件之间的依赖关系、责任分配和控制流程,表现为一组抽象类以及其实例之间协作的方法,它为构件复用提供了上下文(Context)关系。因此构件库的大规模重用也需要框架。
框架、设计模式这两个概念总容易被混淆,其实它们之间还是有区别的。构件通常是代码重用,而设计模式是设计重用,框架则介于两者之间,部分代码重用,部分设计重用,有时分析也可重用。可以说,框架是软件,而设计模式是软件的知识。


第一部分 spring的核心

Spring有很多功能,可以归纳为7个核心部件(后面会讲),spring的主要特性是依赖注入(DI, Dependency Injection)/控制反转(IoC, Inversion of Control)和面向切面编程(AOP, Aspect Oriented Programming)这两大特性(通常DI和IoC是指的同一个特性,但不完全相同)。
IoC: 所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系, 所有的类的创建、销毁都由 spring来控制,也就是说控制对象生存周期的不再是引用它的对象,而是spring。对于某个具体的对象而言,以前是它控制其他对象,现在是所有对象都被spring控制,所以这叫控制反转。
IoC的一个重点是在系统运行中,动态的向某个对象提供它所需要的其他对象。这一点是通过DI(一种松耦合的技术)来实现的。比如对象A需要操作数据库,以前我们总是要在A中自己编写代码来获得一个Connection对象,有了 spring我们就只需要告诉spring,A中需要一个Connection,至于这个Connection怎么构造,何时构造,A不需要知道。在系统运行时,spring会在适当的时候制造一个Connection,然后像打针一样,注射到A当中,这样就完成了对各个对象之间关系的控制。A需要依赖 Connection才能正常运行,而这个Connection是由spring注入到A中的,依赖注入的名字就这么来的。那么DI是如何实现的呢? Java 1.3之后一个重要特征是反射(reflection),它允许程序在运行的时候动态的生成对象、执行对象的方法、改变对象的属性,spring就是通过反射来实现注入的。

AOP: 面向方面(又称面向切面,总觉得都有点抽象)的编程,是一种编程技术,它允许程序员对横切关注点或横切典型的职责分界线的行为(例如日志和事务管理)进行模块化。AOP 的核心构造是方面,它将那些影响多个类的行为封装到可重用的模块中。实现原理主要有两种,动态代理和cglib.

Spring 框架(参考http://www.ibm.com/developerworks/cn/java/wa-spring1/)
Spring 框架是一个分层架构,由 7 个定义良好的模块组成。Spring 模块构建在核心容器之上,核心容器定义了创建、配置和管理 bean 的方式,如下图 1 所示。


图 1. Spring 框架的 7 个模块

组成 Spring 框架的每个模块(或组件)都可以单独存在,或者与其他一个或多个模块联合实现。每个模块的功能如下:
• 核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要组件是 BeanFactory,它是工厂模式的实现。BeanFactory 使用控制反转 (IOC) 模式将应用程序的配置和依赖性规范与实际的应用程序代码分开(注:松耦合)。
• Spring 上下文:Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。如果说BeanFactory使spring成为容器的话,那上下文模块(ApplicationContext)就是使spring成为框架的原因。
• Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向方面的编程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何对象支持 AOP。Spring AOP 模块为基于 Spring 的应用程序中的对象提供了事务管理服务。通过使用 Spring AOP,不用依赖 EJB 组件,就可以将声明性事务管理集成到应用程序中。
• Spring DAO:JDBC DAO 抽象层提供了有意义的异常层次结构,可用该结构来管理异常处理和不同数据库供应商抛出的错误消息。异常层次结构简化了错误处理,并且极大地降低了需要编写的异常代码数量(例如打开和关闭连接)。Spring DAO 的面向 JDBC 的异常遵从通用的 DAO 异常层次结构。Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Template的JDBC的使用方式,另一种则是在JdbcTemplate基础之上的构建的基于操作对象的JDBC的使用方式。
• Spring ORM:Spring 框架插入了若干个 ORM 框架,从而提供了 ORM 的对象关系工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有这些都遵从 Spring 的通用事务和 DAO 异常层次结构。
• Spring Web 模块:Web 上下文模块建立在应用程序上下文模块之上,为基于 Web 的应用程序提供了上下文。所以,Spring 框架支持与 Jakarta Struts 的集成。Web 模块还简化了处理多部分请求以及将请求参数绑定到域对象的工作。
• Spring MVC 框架:MVC 框架是一个全功能的构建 Web 应用程序的 MVC 实现。通过策略接口,MVC 框架变成为高度可配置的,MVC 容纳了大量视图技术,其中包括 JSP、Velocity、Tiles、iText 和 POI。
• Spring还支持远程调用,允许将java对象的某些功能展现为远程调用,如果需要远程访问对象,远程调用模块会使编写远程对象很简单,就像是本地POJO(Plain Old Java Object)一样。有一些远程调用选项,包括RMI(Remote Method Invocation), Hessian,Burlap, JAX-RPC和Spring自己的HTTP Invoker.
• Java消息服务(JMS)远程调用的下面是取决于网络可靠性和通讯双方的可用性。基于消息的通讯是可靠的,并且即使在网络和端点不可用时,也可以保证消息的传递。
下面简要说明DI和AOP的概念。例子来自《spring in action(第二版)》,省略了例子描述,只留了代码示意。

DI
最常用的有两种注入方法(另外还有工厂方法注入,不常用):set注入和构造函数注入。
下面用xml配置简单说明这两种注入方式时spring做了什么操作。配置文件hello.xml。



在<bean>元素中,<property>元素表示在实例化此bean时通过set方法设置属性值(注意:这里只是描述spring做的事情,实际是用反射的写法实现的下面代码)。



上面主程序用到的BeanFactory就是spring容器,使用xml配置bean,所以使用的是XmlBeanFactory.

耦合是一个双头怪物,一方面,紧密耦合的代码难以测试,难以重用,难以理解;另一方面,完全没有耦合的代码什么也做不了,为了做一些有意义的工作,类必须以某种方式知道其它类的存在。 耦合是必须的,但要小心管理。
减少耦合的一个通常做法是将具体实现隐藏在接口下面,这样具体实现类的替换不会影响到引用类。

依赖注入的关键优点就是 松散耦合,这样可以尽可能使得应用对象之间保持疏远的关系。面向切面编程技术提供了另外一种解耦合的功能,它将应用功能(例如安全和事务)和对象分开。 反应的编程思想就是依赖接口而不是实现。

AOP
在spring中有多种方法可以用来实现切面,下面举个例子使用新的AOP命名空间(spring2.0引入),首先必须确保在上下文定义xml中申明命名空间:




上面只是给出一个aop的例子,现在不明白完全没关系,后面会单独讲解这个特性。





猜你喜欢

转载自zoroeye.iteye.com/blog/1922785