Spring-IOC容器接口设计与功能

简介: 上一篇文章中我们说到了Spring IOC提供了一个基本的JavaBean容器,通过IOC容器把获取资源的方式反转,Spring使用IOC容器管理依赖关系,将依赖注入到组件中,使依赖的管理和配置更加灵活。那么在Spring中,IOC容器具体是如何设计和实现的呢?在Spring中,IOC容器是如何体现的呢?下面我们一起学习下。

上一篇文章中我们说到了Spring IOC提供了一个基本的JavaBean容器,通过IOC容器把获取资源的方式反转,Spring使用IOC容器管理依赖关系,将依赖注入到组件中,使依赖的管理和配置更加灵活。那么在Spring中,IOC容器具体是如何设计和实现的呢?在Spring中,IOC容器是如何体现的呢?下面我们一起学习下。


IOC容器接口设计:

在SpringIOC容器设计中,有两个主要的容器系列,一个是实现BeanFactory接口的简单容器系列,这系列容器只实现了容器的最基本功能;另一个是ApplicationContext应用上下文,它作为容器的高级形态而存在。ApplicationContext应用上下文在BeanFactory的基础上,增加了很多面向框架的特性,同时对应用环境作了许多适配。


f343b5990a0fd0b2f4c1c4330d04de1e.png


注意,这张图是ioc容器的接口设计图,我们知道接口主要用于功能的扩展,从图中我们可以看出IOC容器的设计都包含了哪些功能。


主要有两条设计主线,分别是一条以BeanFactory为主和一条以ApplicationContext为主的设计主线。ApplicationContext是在BeanFactory添加了许多特性的高级容器。


BeanFactory设计主线:从BeanFactory到HierarchicalBeanFactory再到ConfigurableBeanFactory。BeanFactory定义了基本的IOC容器的规范,包括了getBean()这样的IOC容器基本方法;继承HierarchicalBeanFactory接口,添加了getParentBeanFactory()方法,从而使BeanFactory具备了双亲IOC容器的管理功能;继承ConfigurableBeanFactory接口,主要定义了一些对BeanFactory的配置功能,比如通过setParentBeanFactory()设置双亲IOC容器,通过addBeanPostProcessor()配置Bean后置处理器等。通过这样接口设计的叠加,定义了简单IOC容器的基本功能。


ApplicationContext设计主线:从BeanFactory到ListableBeanFactory再到ApplicationContet,再到我们常用的WebApplicationContext或者ConfigurableApplicationContext接口。继承ListableBeanFactory,细化了许多BeanFactory的接口功能。同时ApplicationContext通过继承MessageSource,ResourceLoader,ApplicationEventPublisher接口,在BeanFactory简单的IOC容器基础上添加了许多高级容器的特性的支持。


当我们想实现一个具体容器时,通过实现相应的接口来完成。比如DefaultListableBeanFactory是实现了ConfigurableBeanFactory,从而成为一个简单IOC容器。


下面是我们看下两个重要的容器:BeanFactory和ApplicationContext.

BeanFactory


BeanFactory是最基本的IOC容器,提供了IOC容器的基本功能,如:getBean(String name)方法,根据名称获取Bean;containsBean(String name)让用户判断是否有包含此名称的Bean等。如接口方法所示:

public interface BeanFactory {
    String FACTORY_BEAN_PREFIX = "&";
    Object getBean(String name) throws BeansException; 
    <T > T getBean(String name, Class < T > requiredType) throws BeansException;
    Object getBean(String name, Object...args) throws BeansException; 
    <T > T getBean(Class < T > requiredType) throws BeansException; 
    <T > T getBean(Class < T > requiredType, Object...args) throws BeansException;
    boolean containsBean(String name);
    boolean isSingleton(String name) throws NoSuchBeanDefinitionException;
    boolean isPrototype(String name) throws NoSuchBeanDefinitionException;
    boolean isTypeMatch(String name, ResolvableType typeToMatch) throws NoSuchBeanDefinitionException;
    boolean isTypeMatch(String name, Class << ? > typeToMatch) throws NoSuchBeanDefinitionException;
    Class << ? > getType(String name) throws NoSuchBeanDefinitionException;
    String[] getAliases(String name);
}



Spring除了提供了一系列访问Bean的接口。我们前面说过,还提供了对该接口的一系列实现供开发者直接使用,以xmlBeanFactory为例:


54b1a4151b8c4aa173908f44cf840183.png


从图中的继承关系,我们可以看出xmlBeanFactory通过层层继承,实现了BeanFactory的接口功能。在XmlBeanFactory中,通过Resource封装BeanDefinition的来源,然后将Resource通过构造函数传递给xmlBeanFactory,再通过XmlBeanDefinitionReader解析BeanDefinition,从定义好的资源位置读入配置信息,完成Bean的载入和注册。


因为一些原因,Spring 3.1以后已经废弃了XmlBeanFactory这个类了,现在推荐使用的是ApplicationContext。我的版本是4.3.1,所以上图中XmlBeanFactory上有横线,表示已废弃。


https://blog.csdn.net/xlecho/article/details/115828549


ApplicationContext


ApplicationContext是IOC容器的高级实现,有很多高级特性,在BeanFactory基础上添加了附加功能,如:支持不同的信息源,访问资源,支持应用事件,在ApplicationContext中提供的附加服务。


以FileSystemXmlApplicationContext为例,ApplicationContext的主要功能,已经在FileSystemXmlApplicationContext 的基类AbstractXmlApplicationContext中实现了。FileSystemXmlApplicationContext 只需要再实现自身设计的功能。


b7a3c705cba409e85f82ecf2ff93ecec.png



主要功能有两个:

  1. 如果应用直接使用FileSystemXmlApplicationContext 实例化上下文的同时,启动IOC容器的refresh()过程。代码如下:
1. public FileSystemXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
            throws BeansException {
        super(parent);
        setConfigLocations(configLocations);
        if (refresh) {
            refresh();
        }
    }



  1. 与FileSystemXmlApplicationContext具体设计相关的功能:从文件系统中加载xml的BeanDefiniton资源。代码如下:
@Override
    protected Resource getResourceByPath(String path) {
        if (path != null && path.startsWith("/")) {
            path = path.substring(1);
        }
        return new FileSystemResource(path);
    }


总结:



通过这两个容器分析我们可以看出,Spring中,BeanFactory定义了容器功能的基本规范,如获取Bean,判断Bean的类型等。同时,Spring在BeanFactory基础上进行了层层扩展,使容器的功能更加丰富,如ApplicationContext继承ResourceLoader接口,使容器可以从不同地方获取BeanDefinition资源,使用户程序可以灵活的定义BeanDefinition信息;继承MessageSource接口,使容器支持参数化和国际化等。所以我们也更清楚的理解了为什么说ApplicationContext是IOC容器的高级实现,简单来说就是ApplicationContext,在BeanFactory的基础上扩展了更多高级的功能。与BeanFactory相比,对ApplicationContext的使用是一种面向框架的使用风格,所以一般建议在开发应用时,使用ApplicationContext作为IOC容器的基本形式。


同时,Spring也为开发者提供了提供了很多IOC容器的实现,开发者可以直接拿过来用。如从文件系统中加载xml形式的BeanDefinition生成IOC容器的FileSystemXmlApplicationContext。读取注解形式的BeanDefinition生成IOC容器的AnnotationConfigApplicationContext等。


大家在阅读源码时,可以先看一下类图,通过类图中的继承关系,我们能大概猜到此容器的主要功能。


通过上面的阅读,相信读者对IOC容器的设计和功能已经有了一个基本的认识。那么IOC容器是如何初始化的呢?如何读取不同形式的BeanDefiniton,生成Bean注册到容器中的呢?请看下一篇:Spring-IOC容器初始化过程


目录
打赏
0
0
0
0
4
分享
相关文章
|
2月前
|
Spring Boot 功能模块全解析:构建现代Java应用的技术图谱
Spring Boot不是一个单一的工具,而是一个由众多功能模块组成的生态系统。这些模块可以根据应用需求灵活组合,构建从简单的REST API到复杂的微服务系统,再到现代的AI驱动应用。
342 8
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
135 32
Spring IoC容器的设计与实现
Spring 是一个功能强大且模块化的 Java 开发框架,其核心架构围绕 IoC 容器、AOP、数据访问与集成、Web 层支持等展开。其中,`BeanFactory` 和 `ApplicationContext` 是 Spring 容器的核心组件,分别定位为基础容器和高级容器,前者提供轻量级的 Bean 管理,后者扩展了事件发布、国际化等功能。
深入理解 Spring Boot 项目中的分页与排序功能
本文深入讲解了在Spring Boot项目中实现分页与排序功能的完整流程。通过实际案例,从Service层接口设计到Mapper层SQL动态生成,再到Controller层参数传递及前端页面交互,逐一剖析每个环节的核心逻辑与实现细节。重点包括分页计算、排序参数校验、动态SQL处理以及前后端联动,确保数据展示高效且安全。适合希望掌握分页排序实现原理的开发者参考学习。
161 4
Spring容器的本质
本文主要讨论Spring容器最核心的机制,用最少的代码讲清楚Spring容器的本质。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
165 6
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
112 1
Spring Core核心类库的功能与应用实践分析
【12月更文挑战第1天】大家好,今天我们来聊聊Spring Core这个强大的核心类库。Spring Core作为Spring框架的基础,提供了控制反转(IOC)和依赖注入(DI)等核心功能,以及企业级功能,如JNDI和定时任务等。通过本文,我们将从概述、功能点、背景、业务点、底层原理等多个方面深入剖析Spring Core,并通过多个Java示例展示其应用实践,同时指出对应实践的优缺点。
112 14

热门文章

最新文章

AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问