Spring 简介

Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB。相对于EJB来说,Spring提供了更加轻量级和简单的编程模型。它增强了简单老式Java对象(POJO)的功能,使其具备了之前只有EJB和其他企业级Java规范才具有的功能。我们将从以下几个方面开始,介绍Spring。

1.简化Java开发

使用Spring可以让简单的JavaBean实现之前只有EJB才能完成的事情。为了降低Java开发的复杂度,Spring采用了以下的4种关键策略:

  • 基于POJO的轻量级和最小侵入性编程。
  • 通过依赖注入和面向接口编程实现松耦合。
  • 基于切面和惯例进行声明式编程。
  • 通过切面和模板减少样板式代码。

激发POJO的潜能

很多其他的框架通过强迫应用继承它们的类或者实现它们的接口从而导致应用与框架绑死。Spring竭力避免因为自身的API而弄乱你的应用的代码,Spring不会强迫实现Spring规范的接口或者继承Spring规范的类。最坏的场景是,一个类或许会使用Spring注解,但它依旧是POJO。看如下实例:

@Service
public class HelloBean {
    public String sayHello() {
        return "Hello";
    }
}
这是一个简单的普通Java类——POJO。除了注解以外,没有任何地方表明它是一个Spring组件,Spring的非侵入性编程模型意味着这个类在Spring应用和非Spring应用中都可以发挥同样的作用。Spring可以通过DI来装配他们。

依赖注入(DI)

任何一个有意义的应用都会由两个或者更多的类组成,这些类相互之间进行协作来完成特定的业务逻辑。如果按照传统的做法,每个对象负责管理与自己相互协作的对象的引用,这将会导致高度耦合和难以测试的代码,但是完全没有耦合的代码什么也做不了。为了完成有实际意义的功能,不同的类必须以适当的方式进行交互。通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定,对象无需自行创建或管理它们的依赖关系,这就是DI所带来的最大的收益——松耦合。如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下用不同的具体实现进行替换。

创建应用组件之间协作的行为通常称为装配。Spring有多种装配bean的方式,采用XML是很常见的一种装配方式。Spring通过应用上下文(Application Context)装载bean的定义并把它们组装起来,Spring应用上下文全权负责对象的创建和组装。Spring自带了多种应用上下文的实现,它们的主要区别仅仅在于如何加载配置。如果bean的定义是使用XML文件进行配置的,应该选择ClassPathXMLApplicationContext作为应用上下文相对是比较合适的。该类加载位于应用程序类路径下的一个或者多个XML配置文件。

应用切面(AOP)

DI能够让相互协作的组件保持松散的耦合状态,而面向切面编程允许我们把遍历在应用各处的功能分离出来形成可重用的组件。面向切面编程往往被定义为促使软件系统实现关注点分离的一项技术。

系统由许多不同的组件组成,每一个组件各负责一块特定的功能。除了实现自身核心的功能之外,这些组件还经常承担着额外的职责。日志,事务管理和安全这样的系统服务经常融入到自身具有核心业务逻辑的组件中去,这些系统通常被称为核心关注点,因为它们会跨越系统的多个组件。AOP能够将这些服务模板化,并以声明的方式将它们应用到它们需要影响的组件中去。所造成的结果就是这些组件会具有更高的内聚性并且会更加关注自身的业务,完全不需要了解涉及系统服务所带来的复杂性。总之,AOP能够确保POJO的简单性。

2.容纳Bean

在基于Spring的应用中,应用对象生存于Spring容器,Spring容器负责创建对象,装配它们,并管理它们的整个生命周期,从生存到死亡,理解容器将有助于理解对象是如何被管理的。

Spring容器并不是只有一个,Spring自带了多个容器的实现,可以归纳为两种不同的类型。Bean工厂(由org.springframework.beans.factory.beanFactory接口定义)是最简单的容器,提供基本的DI支持。应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用实践给感兴趣的事件监听者。目前大部分系统使用应用上下文的方式,而不再单纯使用BeanFactory。

使用应用上下文

Spring自带了很多类型的应用上下文,下面罗列几个最可能遇到的。

  • AnnotationConfigApplicationContext:从一个或者多个基于Java的配置类中加载Spring应用的上下文。
  • AnnotationConfigWebApplicationContext:从一个或者多个基于Java的配置类中加载Spring Web应用上下文。
  • ClassPathXmlApplicationContext:从类路径下的一个或者多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源。
  • FileSystemXmlApplicationContext:从文件系统下的一个或者多个XML配置文件中加载上下文定义
  • XmlWebApplicationContext:从Web应用下的一个或者多个XML配置文件中加载上下文定义。

使用FileSystemXmlApplicationContext和ClassPathXmlApplicationContext的区别在于:FileSystemXmlApplicationContext在指定的文件系统中加载配置文件,而ClassPathXmlApplicationContext是在所有的类路径下,包括jar包中查找配置文件。应用上下文准备就绪之后,我们就可以调用上下文的getBean()方法从Spring容器中获取bean。

bean的生命周期

在传统的Java应用中,bean的生命周期是很简单的。使用Java关键字new 进行bean实例化,然后该bean就可以使用了。一旦该bean不再使用,则由Java自动进行垃圾回收。相比之下,Spring容器中的bean的生命周期就显得相对复杂多了,下图展示了一个bean装载到Spring应用上下文中的一个典型的生命周期过程:

  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()方法,将bean所在的应用上下文的引用传入进来。
  6. 如果bean实现了BeanPostProcessor接口,Spring将调用它们的ProcessBeforeInitialization方法。
  7. 如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似的,如果bean使用init-method声明了初始化方法,该方法也会被调用。
  8. 如果bean实现了BeanPostProcessor接口,Spring将调用它们的ProcessAfterInitialization方法。
  9. 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁。
  10. 如果bean实现了DisposableBean接口,Spring将调用它的destroy接口方法。同样如果bean使用destroy-method声明了销毁方法,该方法也会被调用。

3.Spring 模块

      当我们下载Spring的发布版本并查看其lib目录时,会发现里面有多个JAR文件。在Spring 4.0中,Spring框架的发布版本包含了20个不同的模块,这些模块依据其所属的功能可以划分成6类不同的功能,如下图所示:

       

Spring核心容器

      容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。在该模块中,除了bean工厂和应用上下文,该模块也提供了许多企业服务,例如E-mail,JNDI访问,EJB集成和调度。所有的Spring模块都构建于核心容器之上,当我们配置应用时,会隐式地使用这些类。

AOP模块

      在AOP模块中,Spring对面向切面编程提供了丰富的支持。这个模块是Spring应用系统中开发切面的基础,借助于AOP,可以将遍布系统的关注点从它们所应用的对象中解耦出来。

数据访问与集成

      除了对JDBC提供模板化代码支持外,Spring还提供了ORM模块。Spring的ORM模块建立在对DAO的支持之上,并为多个ORM框架提供了一种构建DAO的简便方式。Spring没有尝试去创建自己的ORM解决方案,而是对多个流行的ORM框架进行了集成,包括Hibernate,MyBatis。Spring的事务管理支持所有的ORM框架以及JDBC。

       本模块同样包含了在JMS之上构建的Spring抽象层,它会使用消息以异步的方式与其他应用集成。本模块会使用Spring AOP模块为Spring应用中的对象提供事务管理服务。

Web与远程调用

      该模块包含Spring MVC框架以及对其他MVC框架的支持。除了面向用户的Web应用,该模块还提供了多种构建与其他应用交互的远程调用方法。Spring远程调用功能集成了RMI、Hessian、Burlap、JAX-WS。

Instrumentation

      Spring的Instrumentation模块提供了为JVM添加代理的功能。具体来讲,它为Tomcat提供了一个织入代理,能够为Tomcat传递类文件,就像这些文件是被类加载器加载的一样。

测试

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

4.Spring Portfolio

整个Spring Portfolio包括多个构建于核心Spring框架之上的框架和类库。概括的讲,整个Spring Portfolio几乎为每一个领域的Java开发都提供了Spring编程模型。

  • Spring Web Flow:Spring Web Flow建立于Spring MVC 框架之上,它为基于流程的会话式Web应用提供了支持。
  • Spring Web Service
  • Spring Security:安全对于很多的应用来说都是一个非常关键的切面。利用Spring AOP,Spring Security为Spring应用提供了声明式的安全机制。
  • Spring Integration:许多企业级应用都需要与其他的应用进行交互。Spring Integration提供了多种通用应用集成模式的Spring 声明式风格实现。
  • Spring Batch:当我们需要对数据进行大量操作时,我们需要开发一个批处理应用。这时候可以使用Spring Batch强大的面向POJO的编程模型。
  • Spring Data:Spring Data使得在Spring中使用任何数据库都变得非常容易。不管我们使用非关系型数据库还是关系型数据库,Spring Data都为持久化提供了一种简单的编程模型。
  • Spring Social:
  • Spring Mobile:Spring Mobile是Spring MVC新的扩展模块,用于支持移动Web应用开发。
  • Spring for Android:该项目旨在通过Spring 框架为开发基于Android设备的本地应用提供某些简单的支持。
  • Spring Boot:Spring Boot大量依赖于自动部署技术,它能够消除大部分Spring配置。它还提供了多个Starter项目,不管我们使用Maven还是Gradle,这都能减少Spring工程构建文件的大小。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值