Spring的目标

为了降低Java开发复杂性,Spring采取了一下4中关键策略

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

IoC和DI

IOC - Inversion of Control。

控制反转:设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

DI - Dependency Injection。

依赖注入:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

IOC和DI的关系

它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,“依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

AOP

Aspect Oriented Programing 面向切面编程。 将系统级别的代码抽象出来,进行纵向排列,实现低耦合。

Spring容器

容器是Spring框架实现功能的核心,容器不只是帮我们创建了对象那么简单,它负责了对象整个的生命周期的管理——创建、装配、销毁。关于Spring的这个容器你最常听闻的一个术语就是IOC容器。

Spring应用上下文(Application Context)

Spring容器的实现,装载bean的定义并把它们组装起来。应用上下文全权负责对象的创建和组装,各种应用上下文的区别仅仅在于如何加载配置。

  1. AnnotationConfigApplicationContext:从一个或多个基于Java的配置类中加载Spring应用上下文
  2. AnnotationConfigWebApplicationContext:从一个或多个基于Java的配置类中加载Spring Web应用上下文
  3. ClassPathXmlApplicationContext:从类路径下的一个或多个XML配置文件加载上下文定义
  4. FileSystemXmlapplicationcontext:从文件系统下的一个或多个XML配置文件中加载上下文定义
  5. XmlWebApplicationContext:从Web应用下的一个或多个XML配置文件中加载上下文定义

Spring 容器:两种类型

  1. bean工厂(org.springframework.beans.factory.BeanFactory)是最简单的容器,提供基本的DI支持。比较低级
  2. 应用上下文(org.springframework.context.ApplicationContext)基于BeanFactory构建,提供应用框架级别的服务

Bean的生命周期

Spring实战第四版 - 读书笔记01 - Spring之旅
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接口,Spring将调用它的destroy()接口方法。如果bean使用destory-method声明了销毁方法,该方法也会被调用。

相关文章: