第一章 Spring之旅
名词:applet、企业级JavaBean(Enterprise JavaBean, EJB)、Java数据对象(Java Data Object,JDO)、简单老式Java对象(Plain Old Java object,POJO)
为了降低Java开发的复杂性,Spring采取了以下4种关键策略:
1、基于POJO的轻量级和最小侵入性编程;
2、通过依赖注入和面向接口实现松耦合;
3、基于切面和惯例进行声明式编程;
4、通过切面和模板减少样板式代码。
通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定。对象无需自行创建或管理它们的依赖关系。
如果一个对象只通过接口(而不是具体实现或初始化过程)来表明依赖关系,那么这种依赖就能够在对象本身毫不知情的情况下,用不同的具体实现进行替换。
装配(wiring):创建应用组件之间协作的行为通常称为装配。
Spring通过应用上下文(Application Context)装载bean的定义并把它们组装起来。Spring应用上下文全权负责对象的创建和组装。Spring自带了多种应用上下文的实现,它们之间的主要区别仅仅在于如何加载配置。
DI能够让相互协作的软件组件保持松散耦合,而面向切面编程(aspect-orientedprogramming,AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件。
容器是Spring框架的核心。Spring容器使用DI管理构成应用的组件,它会创建相互协作的组件之间的关联。毫无疑问,这些对象更简单干净,更易于理解,更易于重用并且更易于进行单元测试。
Spring容器:
Spring容器并不是只有一个。Spring自带了多个容器实现,可以归为两种不同的类型。bean工厂(由org.springframework.beans.factory.beanFactory接口定义)是最简单的容器,提供基本的DI支持。应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。
使用应用上下文:
Spring自带了多种类型的应用上下文。下面罗列几个我们最有可能用到的:
1、AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文;
2、AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文;
3、ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件中加载上下文定义,把应用上下文的定义文件作为类资源;
4、FileSystemXmlApplicationContext:从文件系统下的一个或多个XML配置文件中加载上下文定义;
5、XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义。
使用FileSystemXmlApplicationContext和使用ClassPathXmlApplicationContext的区别在于:FileSystemXmlApplicationContext在指定的文件系统路径下查找xml文件;而ClassPathXmlApplicationContext是在所有的类路径(包含JAR文件)下查找xml文件。
如果你想从Java配置中加载应用上下文,那么可以使用AnnotationConfigApplicationContext:
ApplicationContext context = new AnnotionConfigApplicationContext(com.springinaction.knights.config.KnightConfig.class);
在这里没有指定加载Spring应用上下文所需的XML文件,AnnotationConfigApplicationContext通过一个配置类加载bean。
应用上下文准备就绪之后,我们就可以调用上下文的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将调用它们的postProcessBeforeInitialization()方法;
7、如果bean实现了InitializingBean接口,Spring将调用它们的afterPropertiesSet()方法。类似地,如果bean使用init-method声明了初始化方法,该方法也会被调用;
8、如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法;
9、此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁;
10、如果bean实现了DisposableBean接口,Spriing将调用它的destroy()接口方法。同样,如果bean使用destroy-method声明了销毁方法,该方法也会被调用。
俯瞰Spring风景线:
在Spring框架的范畴内,你会发现Spring简化Java开发的多种方式。但在Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它将Spring扩展到不同的领域,例如Web服务、REST、移动开发以及NoSQL。
Spring模块:
当我们下载Spring发布版本并查看其lib目录时,会发现里面由多个JAR文件。在Spring 4.0中,Spring框架的发布版本包括了20个不同的模块,每个模块会有3个JAR文件(二进制类库、源码的JAR文件以及javaDoc的JAR文件)。完整的库JAR文件如下图所示:

这些模块依据其所属的功能可以划分为6类不同的功能,如下图所示:

总体而言,这些模块为开发企业级应用提供了所需的一切。但是你也不必将应用建立在整个Spring框架之上,你可以自由地选择适合自身应用需求的Spring模块;当Spring不能满足需求时,完全可以考虑其他选择。事实上,Spring甚至提供了与其他第三方框架和类库的集成点,这样你就不需要自己编写这样的代码了。
Spring核心容器:
容器是Spring框架最核心的部分,它管理着Spring应用中bean的创建、配置和管理。在该模块中,包括了Spring bean工厂,它为Spring提供了DI的功能。基于bean工厂,我们还会发现有多种Spring应用上下文的实现,每一种都提供了配置Spring的不同方式。
除了bean工厂和应用上下文,该模块也提供了许多企业服务,例如E-mail、JNDI访问、EJB集成和调度。
所有的Spring模块都构建于核心容器之上。当你配置应用时,其实你隐式地使用了这些类。
Spring的AOP模块:
在AOP模块中,Spring对面向切面编程提供了丰富的支持。这个模块是Spring应用系统中开发切面的基础。与DI一样,AOP可以帮助应用对象解耦。借助于AOP,可以将遍布系统的关注点(例如事务和安全)从他们所应用的对象中解耦出来。
数据访问与集成
Web与远程调用
Instrumentation
测试
Spring Portfolio
Spring的新功能
示例代码:https://github.com/1977288116/SpringInSimpleUse.git
浙公网安备 33010602011771号