Spring IoC容器

Spring IoC(Inverse of Control,控制反转)是 Spring 框架的核心组成部分,它是一个容器,负责管理对象的生命周期、对象的创建和对象之间的依赖关系。IoC 容器通过 DI(Dependency Injection,依赖注入)实现控制反转。

IoC 基础

IoC(控制反转):由Spring容器管理bean的整个生命周期。通过反射实现对其他对象的控制,包括初始化、创建、销毁等,解放手动创建对象的过程,同时降低类之间的耦合度。

DI(依赖注入):在Spring创建对象的过程中,把对象依赖的属性注入到对象中。有两种方式:构造器注入和属性注入。

IOC的好处:降低了类之间的耦合,对象创建和初始化交给Spring容器管理,在需要的时候只需向容器进行申请。

Spring IoC 容器

ApplicationContext 和 BeanFactory 都是 Spring 框架中 IoC 容器的实现,它们提供了容器的基本功能,如实例化、配置、组装 Bean 以及管理 Bean 生命周期。

  • BeanFactory 是 Spring IoC 容器的基本接口,定义了 IoC 容器的基本行为。DefaultListableBeanFactory 是它的一个具体实现。默认采用懒加载的方式创建Bean。

  • ApplicationContext 是 BeanFactory 的扩展接口,通过扩展DefaultListableBeanFactory 获得基本的 ioc 容器的功能,并提供了更多高级功能和更便捷的访问方式。在容器启动的时候,一次性创建所有Bean。

Spring IoC 容器的初始化过程大致可以分为以下几个步骤:

1.创建容器实例:

首先,创建 IoC 容器的实例,例如 BeanFactory 或 ApplicationContext。

2.加载配置:

容器需要知道如何创建、配置和管理 Bean,这些信息来自于配置元数据。配置元数据可以是 XML 文件、注解或 Java 配置类。

3.解析配置元数据:

根据配置的形式,容器解析配置元数据。对于 XML 配置,容器使用 XML 解析器加载和解析 XML 文件;对于注解,容器通过类路径扫描来发现和解析注解;对于 Java 配置类,容器直接使用提供的类定义。

4.注册 Bean 定义

解析得到的 Bean 定义信息被注册到容器中,以便于后续实例化和使用。

5.Bean的实例化、初始化:

请看下一节

6.容器就绪:

所有 Bean 都已初始化完成,IoC 容器就绪,可以响应应用程序的请求,提供 Bean 实例。

7.关闭容器:

当应用程序结束运行时,容器将关闭。在关闭过程中,容器将调用所有注册的销毁回调,释放资源。

Bean生命周期

Spring Bean 的生命周期大致可以分为以下几个阶段:

1.实例化(Instantiation):

容器使用 Bean 的构造函数或工厂方法创建 Bean 实例。

2.依赖注入/属性注入(Populate properties):

容器根据配置(XML、注解或 Java 配置)注入 Bean 的属性。

3.设置 BeanName 和 BeanFactory:

如果 Bean 实现了 BeanNameAware 和/或 BeanFactoryAware 接口,容器会分别调用 setBeanName 和 setBeanFactory 方法。

4.Bean 后处理器(Bean post-processors):

容器应用所有 BeanPostProcessor 的 postProcessBeforeInitialization 方法。( BeanPostProcessor 可以在 Bean 的属性设置之后和初始化之前或之后,插入自定义的行为。)

5.初始化(Initialization):

如果 Bean 实现了 InitializingBean 接口,容器会调用其 afterPropertiesSet 方法。
如果 Bean 使用了 @PostConstruct 注解的方法,容器会调用这些方法。

6.Bean 后处理器(Bean post-processors):

容器应用所有 BeanPostProcessor 的 postProcessAfterInitialization 方法。 BeanPostProcessor 可以在 Bean 的属性设置之后和初始化之前或之后,插入自定义的行为。)

7.使用 Bean:

Bean初始化完成,供应用使用,直到应用被销毁

8.销毁(Destruction):

当容器关闭时,如果 Bean 实现了 DisposableBean 接口,容器会调用其 destroy 方法。
如果 Bean 使用了 @PreDestroy 注解的方法,容器会调用这些方法。

9.注册为 Disposable:

容器将实现了 DisposableBean 接口或使用 @PreDestroy 注解的 Bean 标记为 Disposable。

扩展

Bean注入容器实现方式

将普通类交给Spring容器管理,通常有以下方法

  1. xml文件配置(非主流,不推荐)

  2. 注解实现方式

  • 使用 @Configuration与@Bean 注解

  • 使用@Controller @Service @Repository @Component 注解标注该类,然后启用@ComponentScan自动扫描

  • 使用@Import 方法,@Import注解把bean导入到当前容器中

Bean的作用域

Spring创建bean默认是单例,每一个Bean的实例只会被创建一次,通过getBean()获取的是同一个Bean的实例。

  • XML文件配置:使用<bean>标签的scope属性来指定一个Bean的作用域

  • 注解配置:使用@scope来声明作用域

常见的作用域singleton、request、session

参考

https://www.developers.pub/wiki/1002310/421#head10

posted @ 2024-08-06 19:13  抒写  阅读(12)  评论(0编辑  收藏  举报