1. 概览
1.1 起源
Spring 是一个开源框架,最早由Rod Johnson创建。Spring是为了解决企业级应用开发的复杂性而创建的。
1.2 Spring是如何简化开发的
为了降低java的复杂性,Spring采用了以下4中关键策略,几乎Spring所做的任何事情都可以追溯到其中一条或多条策略。
- 基于POJO的轻量级和最小侵入性编程
- 通过依赖注入和面向接口实现松耦合
- 基于切面和惯例进行声明式编程
- 通过切面和模板减少样板式代码
1.3 依赖注入 DI
1.3.1 作用
通过DI,对象的依赖关系将由系统中负责协调各对象的第三方组件在创建对象的时候进行设定,对象无需自行创建或管理他们的依赖关系。依赖注入会将所依赖的关系自动交给目标对象,而不是让对象自己去获取依赖。
DI 所带来的最大收益:松耦合
1.4 应用切面AOP
DI能够让相互协作的软件组件保持松耦合,而面向切面编程(aspect-oriented programming, AOP)允许你把遍布应用各处的功能分离出来形成可重用的组件。
我们可以把切面想象为覆盖在很多组件之上的一个外壳。应用是由哪些实现各自业务工鞥呢的模块组成的。借助AOP,可以使用各种功能层去包裹核心业务层,这些层以声明的方式灵活的应用到系统中,你的核心应用甚至根本不知道它们的存在,这是一个非常强大的理念,可以将安全,事务和日志关注点与核心业务逻辑相分离。
1.5 Spring容器
在基于Spring的应用中,你的应用对象生存于Spring容器中,Spring容器负责创建对象,装配它们,配置它们并管理他们的整个生命周期,从生存到死亡。
Spring的容器并不是只有一个,可以归纳为两种不同的类型。
- bean工厂,(由org.springframework.beans.factory.BeanFactory接口定义)是最简单的容器,提供基本的DI支持。
- 应用上下文(由org.springframework.context.ApplicationContext接口定义)基于BeanFactory构建,并提供应用框架级别的服务,例如从属性文件解析文本信息以及发布应用事件给感兴趣的事件监听者。
虽然这两种容器我们都可以选择,但BeanFactory对于大多数应用都太底层了,因此我们会把主要精力放在应用上下文上。
1.5.1 应用上下文
Spring 自带多种应用上下文,下面罗列几种常见的:
- AnnotationConfigApplicationContext: 从一个或多个基于java的配置类中加载Spring应用上下文
- AnnotationConfigWebApplicationContext: 从一个或多个基于java的配置类中加载spring web应用上下文
- ClassPathXmlApplicationContext: 从类路径下属的一个或多个xml配置文件中加载上下文定义,把应用上下文的定义文件作为类资源
- FileSystemXmlApplicationContext: 从文件系统下的一个或多个xml配置文件中加载上下文信息
- XmlWebApplicationContext: 从web应用下的一个或多个xml配置文件中加载上下文定义
1.6 Bean的声明周期
典型声明周期过程
bean在容器中从创建到销毁经历了若干阶段,每个阶段都可以针对Spring如何管理bean进行个性化定制
下面对spring启动步骤进行简单描述:
- spring对bean进行实例化
- spring将值和bean的引用注入到bean对应的属性中
- 如果bean实现了BeanNameAware接口,spring将bean的ID传递给setBeanName()方法
- 如果bean实现了BeanFactoryAware接口,Spring将抵用setBeanFactory()方法,将BeanFactory容器实例传入
- 如果bean实现了ApplicationContextAware接口,Spring将抵用setApplicationContext()方法,将bean所在应用上下文的引用传入进来
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessBeforeInitialization()方法
- 如果bean实现了InitializingBean接口,spring将调用它们的afterPropertiesSet()方法,累死的,如果bean使用init-method声明了初始化方法,该方法将会被调用
- 如果bean实现了BeanPostProcessor接口,Spring将调用它们的postProcessAfterInitialization()方法
- 此时,bean已经准备就绪,可以被应用程序使用了,它们将一直驻留在应用上下文中,直到该应用上下文被销毁
- 如果bean实现了DisposableBean接口,spring将调用它的destory()接口方法,同样,bean使用destory-method声明了销毁方法,该方法也会被调用
参考 《Spring 实战 第四版》