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容器管理,通常有以下方法
-
xml文件配置(非主流,不推荐)
-
注解实现方式
-
使用 @Configuration与@Bean 注解
-
使用@Controller @Service @Repository @Component 注解标注该类,然后启用@ComponentScan自动扫描
-
使用@Import 方法,@Import注解把bean导入到当前容器中
Bean的作用域
Spring创建bean默认是单例,每一个Bean的实例只会被创建一次,通过getBean()获取的是同一个Bean的实例。
-
XML文件配置:使用<bean>标签的scope属性来指定一个Bean的作用域
-
注解配置:使用@scope来声明作用域
常见的作用域singleton、request、session