Spring IoC 容器

34 阅读6分钟

Spring IoC 容器概述

Spring框架的核心特性之一是其Inversion of Control (IoC)容器,它提供了对象生命周期管理、线程管理、企业服务集成、查找服务、AOP支持等高级功能。

IoC Service Provider 角色

IoC Service Provider,其核心功能包括:

  • 对象创建管理:根据配置创建和管理对象实例。
  • 依赖注入服务:自动将对象所需的其他对象注入,消除对象间的紧耦合。

在Spring中,spring的IoC容器,也包含了 Service Provider 的 俩大功能(主要负责对象创建管理和依赖注入服务。)

Spring IoC 容器功能概览

  • 对象生命周期管理:控制对象的创建、初始化、销毁过程,确保每个对象在其整个生命周期内的状态正确无误。
  • 线程管理:在多线程环境下,管理对象的共享和同步,确保线程安全。
  • 企业服务集成:整合如事务管理、消息传递、远程调用等企业级服务,简化复杂业务逻辑的实现。
  • 查找服务:提供服务定位机制,使对象能够找到并使用其他对象的服务,无需硬编码依赖关系。
  • AOP支持:支持面向切面编程,允许在不修改对象代码的情况下添加新功能,如日志记录、权限检查等。

Spring IoC 容器类型

Spring提供了两种主要的IoC容器类型:

  1. BeanFactory

    • 基础类型IoC容器:提供完整的IoC服务支持,是最基本的对象工厂,负责Bean的创建、装配和管理。
    • 延迟加载:支持懒加载模式,只有在第一次请求时才创建Bean实例。
  2. ApplicationContext

    • 高级类型IoC容器:在BeanFactory的基础上构建,增加了更多高级功能,如事件发布、国际化信息支持、资源访问等。
    • 全栈服务:适用于构建完整的企业级应用,提供更丰富、更友好的API和更好的错误信息。

总结

Spring IoC容器是框架的核心,通过BeanFactory和ApplicationContext提供了从基础到高级的全面服务。选择哪种容器取决于具体的应用场景和需求,但大多数情况下,ApplicationContext因其丰富的特性和更好的上下文感知能力而被广泛采用。

BeanFactory和ApplicationContext的关系

image.png

ApplicationContext 在 BeanFactory基础上 构建, 还支持 事件发布 国际化信息支持 资源访问;

ResourcePatternResolver Spring里面的类,这个是什么意思?

ResourcePatternResolver是Spring框架中的一个接口,它扩展了ResourceLoader接口并提供了一种机制来解析和访问符合特定模式的资源集合。这个接口的主要作用是能够基于某种模式(通常是Ant风格的路径匹配模式)来查找和加载多个资源,而不仅仅是一个单一的资源。

在Spring中,Resource接口代表了对底层资源(如文件系统上的文件、类路径资源、URL资源等)的抽象封装。ResourceLoader接口则提供了一个getResource(String location)方法来定位和加载单个资源。

ResourcePatternResolver进一步增强了这种能力,它定义了一个getResources(String locationPattern)方法,这个方法接受一个包含通配符的资源位置模式,返回所有匹配该模式的Resource实例数组。这使得开发人员能够很容易地加载一组相关的资源,例如,所有位于某个包及其子包下满足特定命名约定的.properties文件。

以下是ResourcePatternResolver的一些常见用途:

  • 加载类路径下的所有.class文件。
  • 加载文件系统中某个目录及其子目录下的所有文件。
  • 加载Web应用上下文中的静态资源。

PathMatchingResourcePatternResolverResourcePatternResolver的一个常用实现,它利用Ant风格的路径匹配器来解析资源模式。这个实现类通常用于从类路径或文件系统中加载资源。

例如,下面的代码展示了如何使用PathMatchingResourcePatternResolver来加载类路径下所有名为*.xml的文件:

import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;

public class ResourcePatternExample {
    public static void main(String[] args) throws Exception {
        PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource[] resources = resolver.getResources("classpath*:/*.xml");
        
        for (Resource resource : resources) {
            System.out.println(resource.getFilename());
        }
    }
}

这段代码会输出类路径下所有根目录中的.xml文件的文件名。

为什么 ApplicationContext需要具备 ResourcePatternResolver ?

ApplicationContext在Spring框架中扮演着核心容器的角色,它不仅负责管理Bean的生命周期,还提供了许多高级特性,如国际化、事件广播、资源访问等。ApplicationContext需要具备ResourcePatternResolver的能力,主要有以下几个原因:

  1. 资源访问能力增强ApplicationContext作为Spring应用的中心,需要能够访问到各种类型的资源,包括但不限于配置文件、模板文件、图片、音频、视频、JSON或XML数据文件等。ResourcePatternResolver接口提供了根据模式(pattern)匹配和访问一组资源的能力,这比仅仅访问单个资源要强大得多。

  2. 自动化配置和扫描: Spring框架支持基于注解的自动装配和组件扫描(component scanning)。例如,@ComponentScan注解可以指定哪些包下的组件应该被自动检测和注册为Spring Bean。ResourcePatternResolver的能力使得ApplicationContext能够识别和加载这些包下的所有相关类,包括使用@Component@Service@Repository@Controller等注解的类。

  3. 模式匹配的灵活性ResourcePatternResolver使用Ant风格的路径匹配模式,这为资源定位提供了极大的灵活性。开发人员可以使用通配符来匹配特定的文件名或目录结构,使得资源的加载更加动态和适应性更强。

  4. 统一的资源访问接口: 通过ResourcePatternResolverApplicationContext能够提供一个统一的接口来访问不同来源的资源,无论是文件系统、类路径、Web应用上下文还是URL资源。这简化了资源访问的代码,并确保了资源加载的一致性和可预测性。

  5. 扩展性和集成性: 由于ResourcePatternResolver接口的存在,ApplicationContext可以更容易地与其他框架或外部系统集成,如加载数据库连接配置、消息队列配置文件等。它还支持在不同的部署环境下(如开发、测试、生产)动态切换资源位置,增强了系统的可配置性和可维护性。

因此,ApplicationContext具备ResourcePatternResolver的能力,对于构建健壮、灵活和易于维护的Spring应用程序至关重要。它使得开发者能够以更简洁、更一致的方式访问和管理各种类型的资源,同时充分利用Spring框架提供的丰富功能。