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框架技术的小伙伴有所帮助。

图书推荐

目录
相关文章
|
5天前
|
设计模式 XML Java
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
本文详细介绍了Spring框架的核心功能,并通过手写自定义Spring框架的方式,深入理解了Spring的IOC(控制反转)和DI(依赖注入)功能,并且学会实际运用设计模式到真实开发中。
【23种设计模式·全精解析 | 自定义Spring框架篇】Spring核心源码分析+自定义Spring的IOC功能,依赖注入功能
|
3天前
|
存储 Java 应用服务中间件
【Spring】IoC和DI,控制反转,Bean对象的获取方式
IoC,DI,控制反转容器,Bean的基本常识,类注解@Controller,获取Bean对象的常用三种方式
|
9天前
|
XML Java 数据格式
Spring容器Bean之XML配置方式
通过对以上内容的掌握,开发人员可以灵活地使用Spring的XML配置方式来管理应用程序的Bean,提高代码的模块化和可维护性。
42 6
|
25天前
|
存储 缓存 Java
Spring面试必问:手写Spring IoC 循环依赖底层源码剖析
在Spring框架中,IoC(Inversion of Control,控制反转)是一个核心概念,它允许容器管理对象的生命周期和依赖关系。然而,在实际应用中,我们可能会遇到对象间的循环依赖问题。本文将深入探讨Spring如何解决IoC中的循环依赖问题,并通过手写源码的方式,让你对其底层原理有一个全新的认识。
45 2
|
25天前
|
安全 Java 开发者
Spring容器中的bean是线程安全的吗?
Spring容器中的bean默认为单例模式,多线程环境下若操作共享成员变量,易引发线程安全问题。Spring未对单例bean做线程安全处理,需开发者自行解决。通常,Spring bean(如Controller、Service、Dao)无状态变化,故多为线程安全。若涉及线程安全问题,可通过编码或设置bean作用域为prototype解决。
32 1
|
1月前
|
前端开发 Java Docker
使用Docker容器化部署Spring Boot应用程序
使用Docker容器化部署Spring Boot应用程序
|
1月前
|
Java Docker 微服务
利用Docker容器化部署Spring Boot应用
利用Docker容器化部署Spring Boot应用
53 0
|
1月前
|
安全 Java 测试技术
Java开发必读,谈谈对Spring IOC与AOP的理解
Spring的IOC和AOP机制通过依赖注入和横切关注点的分离,大大提高了代码的模块化和可维护性。IOC使得对象的创建和管理变得灵活可控,降低了对象之间的耦合度;AOP则通过动态代理机制实现了横切关注点的集中管理,减少了重复代码。理解和掌握这两个核心概念,是高效使用Spring框架的关键。希望本文对你深入理解Spring的IOC和AOP有所帮助。
44 0
|
20天前
|
监控 NoSQL 时序数据库
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
《docker高级篇(大厂进阶):7.Docker容器监控之CAdvisor+InfluxDB+Granfana》包括:原生命令、是什么、compose容器编排,一套带走
165 77
|
28天前
|
监控 Docker 容器
在Docker容器中运行打包好的应用程序
在Docker容器中运行打包好的应用程序