Spring Framework的核心:IoC容器的实现(1)

简介: Spring Framework的核心:IoC容器的实现(1)

2.1 Spring IoC容器概述

Spring 容器是 Spring 框架的核心。 容器将创建对象、将它们连接在一起、配置它们并管理它们从创建到销毁的完整生命周期。 Spring 容器使用 DI 管理构成应用程序的组件。 这些对象称为 Spring Bean。

容器通过读取提供的配置元数据来获取关于要实例化、配置和组装哪些对象的指令。 配置元数据可以由 XML、Java 注解或 Java 代码表示。 下图展示了 Spring 工作原理的高级视图。 Spring IoC 容器利用 Java POJO 类和配置元数据来生成一个完全配置和可执行的系统或应用程序。

Spring IoC负责创建对象、管理对象(通过依赖注入(DI)、装配对象、配置对象,并且管理这些对象的整个生命周期。

其实IoC包括依赖查找(DL)和依赖注入(DI);只不过DL因为有侵入性 (它需要用户自己去是使用 API 进行查找资源和组装对象),已经被抛弃。所以现在提到IoC,更多的想到的就是依赖注入(DI)了。

  • IOC: Spring 反向控制应用程序需要的资源。
  • DI: 应用程序依赖Spring为其提供资源。

其中的DI—Dependency Injection,即“依赖注入”:组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”。

谁依赖于谁:

  • 当然是应用程序依赖于IoC容器;

为什么需要依赖:

  • 应用程序需要IoC容器来提供对象需要的外部资源;

谁注入谁:

  • 很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

注入了什么:

  • 就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

2.1.1IoC容器的依赖反转模式

依赖反转是一种软件设计原则,它使得高层模块不依赖于低层模块的具体实现,而是依赖于抽象接口或者抽象类。

在传统的开发中,对象的创建和管理通常由对象自身负责,一个对象会直接创建并管理其所依赖的其他对象。这种情况下,高层模块对低层模块的实现产生了依赖,导致代码的耦合度增加。

具体来说,Spring的IoC容器将对象的创建和管理以及对象间的依赖关系的处理交给了容器来完成。开发人员只需要在配置文件或注解中声明对象的依赖关系,而不需要显式地去创建对象或解决对象之间的依赖。

org.springframework.beansorg.springframework.context 包是Spring Framework的IoC容器的基础。 BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象。 ApplicationContextBeanFactory 的一个子接口。它增加了:

  • 更容易与Spring的AOP功能集成
  • Message resource 处理(用于国际化)
  • 事件发布
  • 应用层的特定上下文,如 WebApplicationContext,用于 web 应用

简而言之,BeanFactory 提供了配置框架和基本功能,而 ApplicationContext 则增加了更多的企业特定功能。ApplicationContext 是 BeanFactory 的一个完整的超集。

在Spring中,构成你的应用程序的骨干并由Spring IoC容器管理的对象被称为Bean。Bean是一个由Spring IoC容器实例化、组装和管理的对象。否则,Bean只是你的应用程序中众多对象中的一个。Bean以及它们之间的依赖关系都反映在容器使用的配置元数据中。

2.1.2 IoC容器的两种表现形式

容器 描述
Spring BeanFactory 容器 这是为 DI 提供基本支持的最简单的容器,由 org.springframework.beans.factory.BeanFactory 接口定义。 Spring 中仍然存在 BeanFactory 及其相关接口,如BeanFactoryAwareInitializingBeanDisposableBean,目的是为了向后兼容大量与 Spring 集成的第三方框架。
Spring ApplicationContext 容器 此容器添加了更多特定于企业的功能,例如从属性文件解析文本消息的能力以及将应用程序事件发布到感兴趣的事件侦听器的能力。 这个容器由 org.springframework.context.ApplicationContext 接口定义。

2.1.3 IoC容器的介绍和使用:

BeanFactory容器的使用:

这是为 DI 提供基本支持的最简单的容器,由 org.springframework.beans.factory.BeanFactory 接口定义。 Spring中仍然存在BeanFactory及其相关接口,如BeanFactoryAware、InitializingBean、DisposableBean,目的是为了向后兼容大量与Spring集成的第三方框架。

有许多 BeanFactory 接口的实现直接随 Spring 提供。 最常用的 BeanFactory 实现是 XmlBeanFactory 类。 此容器从 XML 文件中读取配置元数据,并使用它来创建完全配置的系统或应用程序。

在资源有限的情况下,如移动设备或基于小程序的应用程序,BeanFactory 通常是首选。 因此,除非您有充分的理由不这样做,否则请使用 ApplicationContext。

public static void main(String[] args){
    //ClassPathResource加载在路径CLASSPATH下可用的xml配置文件
    //XmlBeanFactory负责创建并初始化所有对象即xml文件中的bean
    XmlFactory factory = new XmlBeanFactory(new ClassPathResource("_.xml"));    
    类名 对象名 =(类名)factory.getBean("_");
}

ApplicationContext 容器的使用:

Application Context 应用程序上下文是 Spring 的高级容器。 与 BeanFactory 类似,它可以加载 bean 定义、将 bean 连接在一起并根据请求分发 bean。 此外,它还添加了更多特定于企业的功能,例如从属性文件解析文本消息的能力以及将应用程序事件发布到感兴趣的事件侦听器的能力。 该容器由 org.springframework.context.ApplicationContext 接口定义。

常用的 ApplicationContext 实现

  • FileSystemXmlApplicationContext − 这个容器从一个 XML 文件中加载 bean 的定义。 这里需要将 XML bean 配置文件的完整路径提供给构造函数。
  • ClassPathXmlApplicationContext − 这个容器从一个 XML 文件中加载 bean 的定义。 这里您不需要提供 XML 文件的完整路径,但您需要正确设置 CLASSPATH,因为此容器看起来像 CLASSPATH 中的 bean 配置 XML 文件。
  • WebXmlApplicationContext − 此容器从 Web 应用程序中加载包含所有 bean 定义的 XML 文件。
public static void main(String[] args){
    //ApplicationContext接口的实现类有很多种,这里使用ClassPathXmlApplicationContext
    ApplicationContext app = new ClassPathXmlApplicationContext("_.xml");
    类名 对象名 =(类名)app.getBean("_");
}

下期预告: Bean 概述以及如何构建和使用容器

一个Spring IoC容器管理着一个或多个Bean。这些Bean是用你提供给容器的配置元数据创建的(例如,以XML 定义的形式)。

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

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

写在后面🔥🔥🔥:

本专栏是自己深入学习并结合Spring技术内幕一经典图书内容做出的的心得与总结,将其精简编写成一篇专栏供大家学习,希望对新学习Spring框架技术的小伙伴有所帮助。

图书推荐

目录
相关文章
|
4天前
|
Java 测试技术 开发者
IoC容器有什么作用?
【4月更文挑战第30天】IoC容器有什么作用?
35 0
|
4天前
|
XML Java 数据格式
Spring框架入门:IoC与DI
【5月更文挑战第15天】本文介绍了Spring框架的核心特性——IoC(控制反转)和DI(依赖注入)。IoC通过将对象的创建和依赖关系管理交给容器,实现解耦。DI作为IoC的实现方式,允许外部注入依赖对象。文章讨论了过度依赖容器、配置复杂度等常见问题,并提出通过合理划分配置、使用注解简化管理等解决策略。同时,提醒开发者注意过度依赖注入和循环依赖,建议适度使用构造器注入和避免循环引用。通过代码示例展示了注解实现DI和配置类的使用。掌握IoC和DI能提升应用的灵活性和可维护性,实践中的反思和优化至关重要。
17 4
|
4天前
|
Java 测试技术 开发者
Spring IoC容器通过依赖注入机制实现控制反转
【4月更文挑战第30天】Spring IoC容器通过依赖注入机制实现控制反转
22 0
|
4天前
|
XML Java 程序员
Spring特性之二——IOC控制反转
Spring特性之二——IOC控制反转
16 4
|
4天前
|
安全 Java 开发者
在Spring框架中,IoC和AOP是如何实现的?
【4月更文挑战第30天】在Spring框架中,IoC和AOP是如何实现的?
24 0
|
4天前
|
Java 开发者 容器
IoC容器如何实现依赖注入?
【4月更文挑战第30天】IoC容器如何实现依赖注入?
21 0
|
4天前
|
XML Java 数据格式
如何配置IoC容器?
【4月更文挑战第30天】如何配置IoC容器?
20 0
|
4天前
|
XML Java 程序员
什么是Spring的IoC容器?
【4月更文挑战第30天】什么是Spring的IoC容器?
20 0
|
4天前
|
监控 Kubernetes Docker
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
【5月更文挑战第9天】本文探讨了Docker容器中应用的健康检查与自动恢复,强调其对应用稳定性和系统性能的重要性。健康检查包括进程、端口和应用特定检查,而自动恢复则涉及重启容器和重新部署。Docker原生及第三方工具(如Kubernetes)提供了相关功能。配置检查需考虑检查频率、应用特性和监控告警。案例分析展示了实际操作,未来发展趋势将趋向更智能和高效的检查恢复机制。
【Docker 专栏】Docker 容器内应用的健康检查与自动恢复
|
2天前
|
Java 虚拟化 Docker
Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别
Docker简介及用途,为什么要使用Docker?Docker容器和虚拟机的区别

热门文章

最新文章