Spring的根本使命是?
简化Java开发
为了降低Java开发的复杂性,Spring采取了哪4种关键策略?
1、基于POJO的轻量级和最小侵入性编程
2、通过依赖注入和面向接口实现松耦合
3、基于切面和惯例进行声明式编程
4、通过切面和模板减少样板式代码
依赖注入与AOP编程
1、如果想对依赖注入有更多的认识,推荐阅读Dhanji R. Prasanna的《Dependency Injection》
2、依赖注入让相互协作的软件组件保持松散耦合,而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件
样板代码
如JDBC、JMS、JNDI和使用REST服务通常会涉及大量的重复代码
Spring容器
并不存在单一的Spring容器,Spring自带了几种容器实现,可以归为两种不同的类型。Bean工厂(bean factories,由org.springframwork.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。应用上下文(application由org.springframework.context.ApplicationContext接口定义),基于BeanFactory之上构建,并提供面向应用的服务,例如从属性文件解析文本信息的能力,以及发布应用事件给感兴趣的事件监听者的能力
虽然我们可以在Bean工厂和应用上下文两者之间任选一种,但Bean工厂对于大多数应用来说往往太低级了,因此应用上下文要比Bean工厂更受欢迎,我们会把精力放在应用上线文中,而不是Bean工厂
使用应用上下文
Spring自带了几种类型的应用上下文,下面罗列了3种是用户最有可能遇到的
1、ClassPathXmlApplicationContext——从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当做类资源
2、FileSystemXmlApplicationContext——读取文件系统下的XML配置文件并加载上下文定义
3、XmlWebApplicationContext——读取Web应用下的XML配置文件并装载上下文定义
将Bean加载到Bean工厂
如何使用一个FileSystemXmlApplicationContext
ApplicationContext context = new FileSystemXmlApplicationContext("c:/foo.xml")
如何使用一个ClassPathXmlApplicationContext
ApplicationContext context = new ClassPathXmlApplicationContext ("foo.xml")
是在所有的类路径(包括JAR文件)下查找foo.xml文件
通过现有的应用上下文引用,你可以调用应用上下文的getBean()方法从Spring容器中获取Bean
Bean的生命周期
传统的Java应用,Bean的生命周期很简单。使用Java关键字new进行Bean实例化,然后该Bean就可以被使用了。一旦该Bean不再被使用,则又Java自动进行垃圾回收
Bean装载到Spring应用上下文中的一个典型的声明周期过程
Bean在Spring容器中从创建到销毁经历了若干阶段,每一阶段都可以针对Spring如何管理Bean进行个性化定制
1、Spring对Bean进行实例化
2、Spring将值和Bean的引用注入进Bean对应的属性中
3、如果Bean实现了BeanNameAware接口,Spring将Bean的ID传递给SetBeanName()接口方法
4、如果Bean实现了BeanFactoryAware接口,Spring将调用setBeanFactory()接口方法,将BeanFactory容器实例传入
5、如果Bean实现了ApplicationContextAware接口,Spring将调用setApplicationContext()接口方法,将应用上下文的引用传入
6、如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()接口方法
7、如果Bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()接口方法。类似地,如果Bean使用initMethod声明了初始化方法,该方法也会被调用
8、如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postPoressAfterInitialization()方法
9、此时此刻,Bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁
10、如果Bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果Bean使用destroy-method声明了销毁方法,该方法也会被调用
Spring模块
Spring框架是由几个不同模块所构成的。当我们下载Spring并解压缩后,在dist目录下你会看到20个不同的JAR文件,如下图
组成Spring的这20个JAR文件依据其所属功能可以划分为6个不同的功能模块
如下图
总体而言,这6个模块为开发企业级应用提供了所需的一切,但是你也不必将应用建立在整个Spring框架之上,你可以自由地选择合适自身应用需求的Spring模块;当Spring不能满足需求时,完全可以考虑其他选择。事实上,Spring甚至还集成了其他第三方框架和类库,你可以自由的使用
核心Spring容器
容器是Spring框架最核心的部分,它负责Spring应用中的Bean的创建、配置和管理。在该模块中,你会发现Spring的Bean工厂提供了依赖注入。在Bean工厂之上,你会发现几种Spring应用上下文的实现,每一种提供了配置Spring的不同方式
除了Bean工厂和应用上下文,该模块也提供了许多企业服务,例如邮件、JNDI访问、EJB集成和调度
正如你所看到的,所有的Spring模块都构建于核心容器之上。当配置应用时,其实隐式使用了这些类。
Spring的AOP模块
在AOP的模块中,Spring对面向切面编程提供了丰富的支持。这个模块是Spring应用系统开发切面的基础。与依赖注入一样,AOP可以帮助应用对象解耦。借助于AOP,可以将遍布应用的关注点(例如事务和安全)从它们所应用的对象中解耦出来
数据访问与集成
使用JDBC编写代码通常会导致大量的样板代码,例如获得数据库连接、创建语句、处理结果集到最后关闭数据连接。Spring的JDBC和DAO(data access objects)模块封装了这些样板式代码,使我们的数据库代码变得简单明了,还可以避免因为释放数据库资源失败而引发的问题。该模块在几种数据库服务的错误信息之上构建了一个语义丰富的异常层,以后我们再也不需要解释那些晦涩专有的SQL错误信息了
Spring为那些喜欢ORM(object-relational mapping) 工具的开发者提供了ORM模块。Spring的ORM模块建立在对DAO的支持上,并为某些ORM框架提供了一种构建DAO的简便方式。Spring没有尝试去创建自己的ORM解决方案,而是对许多流行ORM框架进行集成,包括Hibernate、Java Persisternce API、JDO和iBATIS。Spring的事物管理支持所有的ORM框架以及JDBC
本模块同样包含了在JMS之上构建的Spring抽象层,使用消息以异步的方式与其他应用集成。从Spring3.0开始,本模块还包含了对象到XML映射的特性,它最初是Spring Web Service项目的一部分
除此之外,本模块使用Spring AOP模块为Spring应用中的对象提供事务管理服务
Web和远程调用
MVC模式已经被普遍的接受为一种构建Web应用的方法,它有助于将用户界面逻辑与应用逻辑分离。Java从来不缺少MVC框架,Apache的Struts、JSF、WebWork个Tapestry都是流行的MVC框架
最然Spring集成了多种流行的MVC框架,但它的Web和远程调用模块自带了一个强大的MVC框架,有助于应用提升Web层技术的松耦合。该框架提供了两种形式:面向传统Web应用的基于Servlet的框架和面向使用Java Porlet API的基于Portlet的应用
除了面向用户的Web应用,该模块还提供了构建于其他应用交互的几种远程调用的选择。Spring远程调用服务集成了RMI、Hessian、Burlap、JAX-WS,同时Spring还自带了一个远程跳动框架:HTTP invoker
测试
鉴于开发者自测的重要性,Spring提供了测试模块来测试Spring应用
通过该模块,你会发现Spring为JNDI、Servlet和Portlet编写单元测试提供了一系列的模拟对象实现。对于集成测试,该模块为加载Spring应用上下文中Bean的集合以及与Spring上下文中的Bean进行交互提供了支持
Spring Protfolio
当谈到Spring时,它远远超出了我们的想象。事实上,Spring远不止Spring框架所带来的那些。如果仅仅停留在核心的Spring框架上,我们将错过庞大的Spring Portfoliot所提供的丰富财富。整个Spring Portfolio包括多个构建于核心Spring框架智商的框架和类库。概括地说,整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型
Spring Web Flow
Spring Web Flow建立于Spring MVC框架之上并为基于流程的会话式Web应用(想想购物车,或者向导)提供支持。Spring Web Flow的主页(http://www.springsource.org/webflow)
Spring Web Service
虽然核心的Spring框架提供了将Spring Bean以声明的方式发布为Web Service
但是这些服务基于一个具有争议性的框架 (拙劣的契约置后模型)之上而构建的。这些服务的契约由Bean的接口来决定。Spring Web Service提供了契约优先的Web Service模型,服务的实现都是为了满足服务的契约而编写的
主页:http://static.springsource.org/spring-ws/sites/2.0
Spring Security
安全对于许多应用都是一个非常关键的切面。利用Spring AOP,Spring Security为Spring应用提供了声明式的安全机制
主页:http://static.springsource.org/spring-security/site
Spring Integration
许多企业级应用都需要与其他应用进行交互。Spring Integration提供了几种通用的应用集成模式的Spring声明式风格的实现
Spring Integration的相关书籍<Spring Integration in Action>
主页:http://www.springsource.org/spring-integration
Spring Batch
当我们需要对数据进行大量操作时,没有任何技术可以比批量处理更能胜任此场景的。如果需要开发一个批处理应用,你可以借助于Spring强大的面向POJO的编程模型来使用Spring Batch来实现
Spring Batch相关书籍<Spring Batch in Action>
主页:http://www.springsource.org/spring-batch
Spring Social
社交网络是互联网然然升起的一颗新星,越来越多的应用正在融入社交网络网站,例如Facebook或者Twitter。如果对此感兴趣,你可以了解下Spring Social,Spring的一个社交网络扩展模块
主页:http://www.springsource.org/spring-social