一、概述

IOC容器

Spring Ioc Container和 Bean 介绍

容器概述

Bean

概述

在容器本身内,这些 bean 定义表示为BeanDefinition 对象,其中包含(除其他信息外)以下元数据:

  • 一个包限定的类名:通常是被定义的 bean 的实际实现类。
  • Bean 行为配置元素,它说明 Bean 在容器中的行为方式(范围、生命周期回调等)。
  • 对 bean 执行其工作所需的其他 bean 的引用。这些引用也称为协作者或依赖项。
  • 在新创建的对象中设置的其他配置设置——例如,池的大小限制或在管理连接池的 bean 中使用的连接数。

    实例化bean

    1.使用构造函数实例化

    :::info 当您通过构造函数方法创建一个bean时,所有普通的类都可以被Spring使用,并且与Spring兼容。也就是说,正在开发的类不需要实现任何特定的接口,也不需要以特定的方式编码。只需指定bean类就足够了。但是,根据您为特定bean使用的IoC类型,您可能需要一个默认(空)构造函数。 :::

    2.使用静态工厂方法实例化

3.使用实例工厂方法实例化

Bean作用域

1.The Singleton Scope

下图显示了单例范围的工作原理:

singleton.png

2.The Prototype Scope

prototype.png

Bean生命周期

733213-20180824211814432-2024157371.png
ApplicationContext容器中,Bean的生命周期流程如上图所示,流程大致如下:

  1. 首先容器启动后,会对scope为singleton且非懒加载的bean进行实例化,
  2. 按照Bean定义信息配置信息,注入所有的属性,
  3. 如果Bean实现了BeanNameAware接口,会回调该接口的setBeanName()方法,传入该Bean的id,此时该Bean就获得了自己在配置文件中的id,
  4. 如果Bean实现了BeanFactoryAware接口,会回调该接口的setBeanFactory()方法,传入该Bean的BeanFactory,这样该Bean就获得了自己所在的BeanFactory,
  5. 如果Bean实现了ApplicationContextAware接口,会回调该接口的setApplicationContext()方法,传入该Bean的ApplicationContext,这样该Bean就获得了自己所在的ApplicationContext,
  6. 如果有Bean实现了BeanPostProcessor接口,则会回调该接口的postProcessBeforeInitialzation()方法,
  7. 如果Bean实现了InitializingBean接口,则会回调该接口的afterPropertiesSet()方法,
  8. 如果Bean配置了init-method方法,则会执行init-method配置的方法,
  9. 如果有Bean实现了BeanPostProcessor接口,则会回调该接口的postProcessAfterInitialization()方法,
  10. 经过流程9之后,就可以正式使用该Bean了,对于scope为singleton的Bean,Spring的ioc容器中会缓存一份该bean的实例,而对于scope为prototype的Bean,每次被调用都会new一个新的对象,期生命周期就交给调用方管理了,不再是Spring容器进行管理了
  11. 容器关闭后,如果Bean实现了DisposableBean接口,则会回调该接口的destroy()方法,
  12. 如果Bean配置了destroy-method方法,则会执行destroy-method配置的方法,至此,整个Bean的生命周期结束。