Spring实战3-Spring之旅

Spring的目的是降低java开发的复杂性,具体采用四中策略:


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

创建应用组件之间协作的行为通常称为装配。用XML配置或者声明配置。

Spring通过应用上下文装载Bean的定义并把它们组装起来,该上下文全权负责对象的创建和组装。

依赖注入让相互写作的软件组件保持松散耦合,而AOP编程允许你把遍布应用各处的功能分离出来形成可重用的组件。如日志、事务管理和安全此类的系统服务。这些服务经常融入到有自身核心业务逻辑的组件中去,故它们通常称为横切关注点,因为它们总是跨越系统的多个组件。AOP可以使这些服务模块化,并以声明的方式将它们应用到它们需要影响的组件中去。结果是这些组件具有更高内聚性以及更加关注自身业务,完全不需要了解更能涉及的系统服务的复杂性。

Spring实战3-Spring之旅

Spring容器创建对象,装配它们,管理它们的整个生命周期,从创建到销毁。容器时Spring框架的核心,Spring容器使用依赖注入管理构成应用的组件,它会创建相互协作的组件之间的关联。

Spring自带了几种容器实现,可以归为两种不同的类型:1)Bean工厂(BeanFactory接口定义)是最简单的容器,提供基本的DI支持。2)应用上下文(ApplicationContext接口定义)基于BeanFactory之上构建,并提供面向应用的服务。

Spring常用的应用上下文

  1. ClassPathXmlApplicationContext-从类路径下的XML配置文件中加载上下文定义,把应用上下文定义文件当做资源。
  2. FileSystemXmlApplicationContext-读取文件系统下的XML配置文件并加载上下文定义。
  3. XmlWebApplicationContext-读取Web应用下的XML配置文件并加载上下文定义

Bean的生命周期

Spring实战3-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()方法,将应用上下文的引用传入。
  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使用了destroy-method声明了销毁方法,该方法也会被调用。

Spring架构图--摘自Spring 4

Spring实战3-Spring之旅

转载于:https://my.oschina.net/zhike/blog/425921