Spring核心

为了降低JAVA开发的复杂性,Spring采取了以下4种关键策略:

u   基于POJO的轻量级和最小侵入性编程。

u   通过依赖注入和面向接口实现松耦合。

u   基于切面和惯例进行声明式编码。

u   通过切面和模板减少样板式代码。

耦合具有两面性(two-headed beast)。一方面,紧密耦合的代码难以测试,难以复用,难以理解,并且典型地表现出“打地鼠”式的bug特性(修复一个bug,导致出现一个新的或者甚至更多的bug)。另一方面,一定程度的耦合又是必须的----完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,不同的类必须以适当的方式进行交互。总而言之,耦合是必须的,但就当小心谨慎地管理它。

依赖注入(DI),对象的依赖关系将由负责协调系统中各个对象的第三方组件在创建对象时设定。对象无需自行创建或管理它们的依赖关系----依赖关系将被自动注入到需要它们的对象中去。

创建组件之间的协作的行为通常称为装配。

Spring通过应用上下文(Application Context)装载Bean的定义并把它们组装起来Spring应用上下文全权负责对象的创建和组装。Spring自带了几种应用上下文的实现,它们之间主要的区别仅仅是如何加载它们的配置。

应用切面

依赖注入让相互协作的软件组件保持松散耦合,而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件。

面向切面编程往往被定义为促使应用程序分离关注点的一项技术。系统由许多不同组件组成,每一个组件各负责一块特定功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。诸如日志,事务管理的安全此类的系统服务经常融入到有自身核心业务逻辑的组件中去,这些系统服务通常被称为横切关注点,因为它们总是跨越系统的多个组件。

AOP使服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。结果是这些组件具有更高内聚性以及更加关注自身业务,完全不需要了解可能涉及的系统服务的复杂性。总之,AOP确保POJO保持简单。

我们可以把切面想象为覆盖在很多组件之上的一个外壳。应用是由那些实现各自业务功能的模块组成。利用AOP,你可以使用各种功能层去包裹核心业务层。这些层以声明的方式灵活应用到你的系统中,甚至你的核心应用根本不知道它们的存在。这是一人非常强大的理念,可以将安全、事务和日志关注点与你的核心业务逻辑相分离。

064346_SYMe_2290569.png

在基于Spring的应用中,应用对象生存于Spring容器中。Spring容器创建对象,装配它们,配置它们,管理它们的整个生命周期,从生存到死亡(或者从创建到销毁)。

Spring自带了几种容器实现,可以归为两种不同的类型。Bean工厂(bean factories,由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。应用上下文(application由org.springframework.context.ApplicationContext接口定义)基于BeanFactory之上构建,并提供面向应用的服务,例如从属性文件解析文本信息的能力,以及发布应用事件给感兴趣的事件监听者的能力。

Spring自带了几种类型的应用上下文。

u   ClassPathXmlApplicationContext----从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当作类资源。

u   FileSystemXmlApplicationContext----读取文件系统下的XML配置文件并加载上下文定义。

u   XmlWebApplicationContext----读取Web应用下的XML配置文件并装载上下文定义。

无论是从文件系统中装载应用上下文还是从类路径下装载应用上下文,将Bean加载到Bean工厂的过程都是相似的。例如,如下代码展示了如何加载一个FileSystemXmlApplicationContext:

ApplicationContext context = new FileSystemXmlApplicationContext(“c:/foo.xml”);

类似地,你可以使用ClassPathXmlApplicationContext从应用的类路径下加载应用上下文:

ApplicationContext context = new ClassPathXmlApplicationContext(“foo.xml”);

使用FileSystemXmlApplicationContext和使用ClassPathXmlApplicationContext的区别在于:FileSystemXmlApplicationContext在指定的文件系统路径下查找foo.xml文件;而ClassPathXmlApplicationContext是在所有的类路径(包含JAR文件)下查找foo.xml文件。

通过现有的应用上下文引用,你可以调用应用上下文的getBean()方法从Spring容器中获取Bean。

064451_hrJ3_2290569.png

正如你所见,在Bean准备就绪之前,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使用init-method声明了初始化方法,该方法也会被调用。

8. 如果Bean实现了BeanPostProcessor接口,Spring将调用它们的postPoressAfterInitialization()方法。

9. 此时此刻,Bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。

10.       如果Bean实现了DisposableBean接口,Spring将调用它的destroy()接口方法。同样,如果Bean使用destroy-method声明了销毁方法,该方法也会被调用。

064510_3PQe_2290569.png

核心Spring容器

容器是Spring框架最核心的部分,它负责Spring应用中的Bean的创建、配置和管理。在该模块中,你会发现Spring的Bean工厂提供了依赖注入。在Bean工厂之上你会发现几种Spring应用上下文的实现,每一种提供了配置Spring的不同方式。

除了Bean工厂和应用上下文,该模块也提供了许多企业服务,例如邮件、JNDI访问、EJB集成和调度。

正如你所看到的,所有的Spring模块都构建于核心容器之上。当配置应用时,其实隐式使用了这些类。

SpringAOP模块

在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 Portlet API的基于Portlet的应用。

除了面向用户的Web应用,该模块还提供了构建与其他应用交互的几种远程调用的选择。Spring远程调用服务集成了RMI、Hessian、Burlap、JAX-WS,同时Spring还自带了一个远程调用框架:HTTP invoker。

测试

鉴于开发者自测的重要性,Spring提供了测试模块来测试Spring应用。

通过该模块,你会发现Spring为JNDI、Servlet和Portlet编写单元测试提供了一系列的模拟对象实现。对于集成测试,该模块为加载Spring应用上下文中Bean的集合以及与Spring上下文中的Bean进行交互提供了支持。

Spring Portfolio

当谈到Spring时,它远远超出了我们的想象。事实上,Spring远不止Spring框架所带来的那些。如果仅仅停留在核心的Spring框架上,我们将错过庞大的Spring Portfoliot所提供的丰富财富。整个Spring Portfolio包括多个构建于核心Spring框架之上的框架和类库。概括地说,整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。

Spring Web Flow

Spring Web Flow建立于Spring MVC框架之上并为基于流程的会话式Web应用提供支持。

For more:http://www.springsource.org/webflow

Spring Web Service

虽然核心的Spring框架提供了将Spring Bean以声明的方式发布为Web Service,但是这些服务基于一个具有争议性的架构(拙劣的契约置后模型)之上而构建的。这些服务的契约由Bean的接口来决定。Spring Web Service提供了契约优先的Web Service模型,服务的实现都是为了满足服务的契约而编写的。

For more:http://static.springsource.org/spring-ws/sites/2.0

Spring Security

安全对于许多应用都是一个非常关键的切面。利用Spring AOP,Spring Security为Spring应用提供了声明式的安全机制。

For more:http://static.springsource.org/spring-security/site

Spring Integration

许多企业级应用都需要与其他应用进行交互。Spring Integration提供了几咱通用的应用集成模式的Spring声明式风格的实现。

For more:http://www.springsource.org/spring-integration

Spring Batch

当我们需要对数据进行大量操作时,没有任何技术可以比批处理更能胜任此场景的。如果需要开发一个批处理应用,你可以借助于Spring强大的面向POJO的编程模型来使用Spring Batch来实现。

For more:http://static.springsource.org/spring-batch

Spring Social

社交网络是互联网冉冉升起的一颗新星,越来越多的应用正在融入社交网络网站,例如Facebook或者Twitter。如果对此感兴趣,你可以了解下Spring Social,Spring的一个社交网络扩展模块。

For more:http://www.springsource.org/spring-social

Spring Mobile

Spring Mobile是Spring新的扩展模块用于支持移动Web应用开发。与Spring Mobile相关的是Spring Android项目。这个新项目旨在通过Spring框架为开发基于Android设备的本地应用提供某些简单的支持。

For more:http://www.springsource.org/spring-mobile和http://www.springsource.org/spring-android

Spring Dynamic Modules

Spring Dynamic Module整合了Spring的声明式依赖注入和OSGi的动态组件模型。使用Spring-DM,你可以采用模块化的方式构建应用,这些模块是清晰的、高内聚、低耦合的,并在OSGi框架内以声明的方式发布和消费服务。

Spring-DM作为声明式的OSGi服务,已经正式纳入OSGiBlueprint Container规范,这已经深刻影响了OSGi世界。此外,SpringSource已经把Spring-DM捐献给Eclipse并作为OSGi的Gemini成员项目,现在被称为Gemini Blueprint。

Spring LDAP

除了依赖注入和AOP,另一个贯穿Spring框架的常用技术就是创建基于模板的抽象层来封装多余的复杂操作,例如JDBC查询或JMS消息处理。Spring LDAP为我们带来了Spring风格的基于模板的LDAP访问,消除了因使用LDAP而产生的样板式代码。

Spring Rich Client

基于Web的应用似乎成功地将开发者的焦点从传统的桌面应用上吸引过来。但是如果你是为数不多的还在使用Swing开发应用程序中的一员,那么你可能会希望下载Spring Rich Client,它是一个富应用工具箱,为Swing赋予了Spring的魔力。

Spring .NET

如果使用.NET开发应用,你不必放弃依赖注入和AOP。Spring .NET提供了相同的松耦合和面向切面的Spring特性,但它是面向.NET平台的。

除了核心的DI和AOP特性,Spring .NET还自带了简化.NET开发的多个模块,包括ADO .NET、NHibernate、ASP.NET和MSMQ等。

For more:http://www.springframework.net

Spring-Flex

Adobe的Flex和AIR为富互联网应用开发提供了一种最强大的解决方案。当这些富用户界面需要与服务端的Java代码进行交互时,他们使用一种被称为BlazeDS的远程访问消息技术。Spring-Flex集成包使得Flex和AIR应用可以使用BlazeDS与服务端的Spring Bean进行通信。它还包含了Spring Roo的扩展,可用于快速开发Flex应用。

For more:http://www.springsource.org/spring-flex

http://www.springactionscript.org

Spring Roo

越来越多的开发者基于Spring开发,围绕Spring和与其相关框架的一组惯用语和最佳实践已经形成。同时,诸如Ruby on Rails和Grails此类的框架产生了脚本驱动的编程模型,让构建应用变得更简单。

Roo与其他快速应用开发框架的区别在于它使用Spring框架生成Java代码,所以它带来的是原汁原味的Spring应用,而不是使用对于大多数开发团队陌生的语言面编写的独立框架代码。

Spring Extensions

除了以上我们所介绍的项目,在http://www.springsource.org/extensions主页上还有一批社区驱动的Spring扩展项目。

Spring 2.5新特性

u  使用@Autowired实现基于注解驱动的依赖注入和使用@Qualifier实现细粒度的自动装配(auto-wiring)控制。

u  支持JSR-250注解,包括支持命名资源依赖注入的@Resource,以及对生命周期方法 支持的@PostConstruct和@PreDestroy。

u  自动扫描使用@Component注解(或其他构造型注解)所标注的Spring组件。

u  一个全新的基于注解驱动的Spring MVC编程模型,极大简化了Spring Web开发。

u  基于Junit4和注解的一个新的集成测试框架。

u  完全支持Java6和JavaEE5,涵盖JDBC4.0、JTA1.1、JavaMail1.4和JAX-WS2.0;

u  通过Bean的名字来编织切面的新的Bean命名切入点表达式;

u  内嵌支持AspectJ的类加载器注入;

u  新的XML命名空间,包括配置应用上下文细节的context命名空间和配置消息驱动Bean的jms命名空间;

u  支持在SqlJdbcTemplate中使用命名参数。

Spring3.0新特性

u  Spring MVC全面支持Rest,Spring MVC控制器响应REST风格的URL并返回XML、JSON、RSS或者其他适宜的响应。

u  新的表达式语言把Spring的依赖注入带到了一个新的高度,允许注入各种来源,包含其他Bean和系统属性。

u  Spring MVC新的注解,包含@CookieValue和@RequestHeader,分别从Cookie和请求头中获取值。

u  一个新的XML命名空间,用来减少Spring MVC配置。

u  支持基于JSR-302注解的声明式校验。

u  支持新的JSR-330依赖注入规范。

u  通过注解驱动声明异步和调度方法。

u  一个新的注解驱动的配置模型,几乎可以避免使用XML进行Spring配置。

u  Spring Web Service项目的OXM功能已被迁移到Spring框架核主。

u  从3.0版本开始,Spring要求Java5或更高版本,不再支持Java1.4。

Spring Portfollo新特性

u  Spring Web Flow 2.0已发布,简化了流程定义Schema,比以前更容易创建会话式的Web应用。

u  跟随Spring Web Flow 2.0一起发布的还有Spring JavaScript和Spring Faces。Spring JavaScript是一个可以逐步提高Web页面表现的JavaScript类库。Spring Faces允许在Spring MVC和Spring Web Flow中使用JSF作为视图技术。

u  Acegi Security框架已经全面升级,并作为Spring Security 2.0正式发布。Spring Security提供了新的配置Schema,显著减少了配置应用安全所需要的XML信息。

转载于:https://my.oschina.net/Liopleuro/blog/756600

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值