【Spring】IoC容器 控制反转 与 DI依赖注入 概念 第一期

news2024/11/24 9:47:47

文章目录

  • Spring 和 SpringFramework概念
  • 一、Spring IoC容器 核心概念
  • 1.1 组件和组件管理概念
  • 1.2 Spring IoC容器和容器实现
    • 1.2.1 普通和复杂容器
    • 1.2.2 SpringIoC容器介绍
    • 1.2.3 SpringIoC容器具体接口和实现类
    • 1.2.4 SpringIoC容器管理配置方式
  • 1.3 Spring IoC / DI概念总结
  • 二、 Spring IoC / DI 实现步骤 简略
    • 2.1 配置文件
    • 2.2 实例化IoC容器
    • 2.3 获取Bean(组件)
  • 总结
    • 图解IoC配置流程:
    • 技术体系结构
    • 框架( Framework )
    • 组件交给Spring管理优势


Spring 和 SpringFramework概念

Spring官网

  • 广义的 Spring:Spring 技术栈(全家桶)
    • 广义上的 Spring 泛指以 Spring Framework 为基础的 Spring 技术栈。
    • 例如 Spring Framework、Spring MVC、SpringBoot、Spring Cloud、Spring Data、Spring Security 等,其中 Spring Framework 是其他子项目的基础。
  • 狭义的 Spring:Spring Framework(基础框架)
    • 狭义的 Spring 特指 Spring Framework,通常我们将它称为 Spring 框架。
    • 提供的功能包括:依赖注入(Dependency Injection)、面向切面编程(AOP)、声明式事务管理(TX)…

Spring全家桶的其他框架都是以SpringFramework框架为基础!

SpringFramework框架结构图:
1

功能模块功能介绍
Core Container核心容器,在 Spring 环境下使用任何功能都必须基于 IOC 容器。
AOP&Aspects面向切面编程
TX声明式事务管理。
Spring MVC提供了面向Web应用程序的集成功能。

一、Spring IoC容器 核心概念

1.1 组件和组件管理概念

组件:可以复用的JAVA对象(unity封装的各种component组件)
1

  • 替我们创建组件的对象
  • 帮我们保存组件的对象
  • 帮助我们自动组装
  • 替我们管理事务
  • 协助我们整合其他框架

之前需要new才能使用的类对象,需要自己赋值等等的操作 ,都改成使用spring帮我们处理,IoC容器帮助我们管理组件…

Spring充当组件管理角色(IoC):
组件可以完全交给 Spring 框架进行管理,Spring框架替代了原有的new对象和对象属性赋值动作等!

Spring具体的组件管理动作包含:

  • 组件对象实例化
  • 组件对象属性赋值
  • 组件对象之间引用
  • 组件对象存活周期管理
  • 我们只需要编写元数据(配置文件)告知Spring 管理哪些类组件和他们的关系即可!
    注意:组件是映射到应用程序中所有可重用组件的Java对象,应该是可复用的功能对象!
  • 组件一定是对象
  • 对象不一定是组件
    综上所述,Spring 充当一个组件容器,创建、管理、存储组件,减少了我们的编码压力,让我们更加专注进行业务编写!

配置地狱?!

1.2 Spring IoC容器和容器实现

IoC—Inversion of Control,即“控制反转”。

  • 一种设计思想,IoC意味着将设计好的对象交给容器控制。
  • 传统JAVA 是 对象内部通过new进行创建对象,是程序主动去创建依赖对象;
  • 而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建

由 Spring 通过IoC容器来new,不再由我主动来new了。
之后我从容器里直接拿出对象用就好

1.2.1 普通和复杂容器

普通容器
只能用来存储,没有更多功能。

  • 数组
  • 集合:List
  • 集合:Set

复杂容器
Servlet 容器能够管理 Servlet(init,service,destroy)、Filter、Listener 这样的组件的一生,所以它是一个复杂容器。

名称时机次数
创建对象默认情况:接收到第一次请求 修改启动顺序后:Web应用启动过程中一次
初始化操作创建对象之后一次
处理请求接收到请求多次
销毁操作Web应用卸载之前一次
  • SpringIoC 容器也是一个复杂容器。
    它们不仅要负责创建组件的对象、存储组件的对象,还要负责调用组件的方法让它们工作,最终在特定情况下销毁组件。
  • 总结:
  • Spring管理组件的容器,就是一个复杂容器,不仅存储组件,也可以管理组件之间依赖关系,并且创建和销毁组件等!

1.2.2 SpringIoC容器介绍

  • Spring IoC 容器,负责实例化、配置和组装 bean(组件)。
  • 容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。
  • 配置元数据以 XML、Java 注解或 Java 代码形式表现。
  • 它允许表达组成应用程序的组件以及这些组件之间丰富的相互依赖关系。

应用程序类与配置元数据相结合:2

1.2.3 SpringIoC容器具体接口和实现类

SpringIoc容器接口

BeanFactory 接口提供了一种高级配置机制,能够管理任何类型的对象,它是SpringIoC容器标准化超接口!

ApplicationContextBeanFactory 的子接口。它扩展了以下功能:

  • 更容易与 Spring 的 AOP 功能集成
  • 消息资源处理(用于国际化)
  • 特定于应用程序给予此接口实现,例如Web 应用程序的 WebApplicationContext
    简而言之, BeanFactory 提供了配置框架和基本功能,而 ApplicationContext 添加了更多特定于企业的功能。 ApplicationContextBeanFactory 的完整超集!
    ApplicationContext容器实现类
    1
类型名简介
ClassPathXmlApplicationContext通过读取类路径下的 XML 格式的配置文件创建 IOC 容器对象
FileSystemXmlApplicationContext通过文件系统路径读取 XML 格式的配置文件创建 IOC 容器对象
AnnotationConfigApplicationContext通过读取Java配置类创建 IOC 容器对象
WebApplicationContext专门为 Web 应用准备,基于 Web 环境创建 IOC 容器对象,并将对象引入存入 ServletContext 域中。

1

1.2.4 SpringIoC容器管理配置方式

Spring框架提供了多种配置方式:XML配置方式、注解方式和Java配置类方式

  1. XML配置方式:是Spring框架最早的配置方式之一,通过在XML文件中定义Bean及其依赖关系、Bean的作用域等信息,让Spring IoC容器来管理Bean之间的依赖关系。该方式从Spring框架的第一版开始提供支持。
  2. 注解方式:从Spring 2.5版本开始提供支持,可以通过在Bean类上使用注解来代替XML配置文件中的配置信息。通过在Bean类上加上相应的注解(如@Component, @Service, @Autowired等),将Bean注册到Spring IoC容器中,这样Spring IoC容器就可以管理这些Bean之间的依赖关系。
  3. Java配置类方式:从Spring 3.0版本开始提供支持,通过Java类来定义Bean、Bean之间的依赖关系和配置信息,从而代替XML配置文件的方式。Java配置类是一种使用Java编写配置信息的方式,通过@Configuration、@Bean等注解来实现Bean和依赖关系的配置。

主要是:配置类+注解方式

1.3 Spring IoC / DI概念总结

IoC控制反转 将 实例化对象控制权利 反转 交给 spring
因为 使用Ioc ,要用DI 管理内部数据引用

  • IoC容器

    Spring IoC 容器,

    • 负责实例化、配置和组装 bean(组件)核心容器。
    • 容器通过读取配置元数据来获取有关要实例化、配置和组装组件的指令。
  • IoC(Inversion of Control)控制反转

    • IoC 主要是针对对象的创建调用控制而言的,
    • 也就是说,当应用程序需要使用一个对象时,再是应用程序直接创建该对象,而是由 IoC 容器来创建和管理
    • 即控制权由应用程序转移到 IoC 容器中,也就是“反转”了控制权。
    • 这种方式基本上是通过依赖查找的方式来实现的,
    • 即 IoC 容器维护着构成应用程序的对象,并负责创建这些对象。
  • DI (Dependency Injection) 依赖注入

    • DI 是指在组件之间传递依赖关系的过程中,将依赖关系在容器内部进行处理,
    • 这样就不必在应用程序代码中硬编码对象之间的依赖关系,实现了对象之间的解耦合
    • 在 Spring 中,DI 是通过 XML 配置文件或注解的方式实现的。
    • 它提供了三种形式的依赖注入:构造函数注入、Setter 方法注入和接口注入
      1

二、 Spring IoC / DI 实现步骤 简略

1.编写配置文件
2.实例化IoC容器
3. 获取Bean(组件)
在这里插入图片描述

2.1 配置文件

<?xml version="1.0" encoding="UTF-8"?>
<!-- 此处要添加一些约束,配置文件的标签并不是随意命名 -->
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    https://www.springframework.org/schema/beans/spring-beans.xsd">

  <bean id="..." [1] class="..." [2]>  
    <!-- collaborators and configuration for this bean go here -->
  </bean>

  <bean id="..." class="...">
    <!-- collaborators and configuration for this bean go here -->
  </bean>
  <!-- more bean definitions go here -->
</beans>

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

<bean /> 标签 == 组件信息声明

  • id 属性是标识单个 Bean 定义的字符串。
  • class 属性定义 Bean 的类型并使用完全限定的类名。

2.2 实例化IoC容器

//实例化ioc容器,读取外部配置文件,最终会在容器内进行IoC和DI动作
ApplicationContext context = 
           new ClassPathXmlApplicationContext("services.xml", "daos.xml");

2.3 获取Bean(组件)

ApplicationContext 是一个高级工厂的接口,能够维护不同 bean 及其依赖项的注册表。

通过使用方法 T getBean(String name, Class<T> requiredType) ,您可以检索 bean 的实例。

允许读取 Bean 定义并访问它们,如以下示例所示:

//创建ioc容器对象,指定配置文件,ioc也开始实例组件对象
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
//获取ioc容器的组件对象
PetStoreService service = context.getBean("petStore", PetStoreService.class);
//使用组件对象
List<String> userList = service.getUsernameList();

总结

自己实例化对象方式: (不考虑反射)

使用构造函数实例化,有参/无参构造

工厂模式实例化,静态/非静态工厂

不同的实例化方式对象和组件IOC的配置方式也不同

图解IoC配置流程:

1

技术体系结构

  • 单一架构

    • 一个项目,一个工程,导出为一个war包,在一个Tomcat上运行。也叫all in one。
    • 单一架构,项目主要应用技术框架为:Spring , SpringMVC , Mybatis
      1
  • 分布式架构

    • 一个项目(对应 IDEA 中的一个 project),拆分成很多个模块,每个模块是一个 IDEA 中的一个 module。
      • 每一个工程都是运行在自己的 Tomcat 上。
      • 模块之间可以互相调用。每一个模块内部可以看成是一个单一架构的应用。

1
分布式架构,项目主要应用技术框架:SpringBoot (SSM), SpringCloud , 中间件等

框架( Framework )

框架 = jar包 + 配置文件 {jar拥有功能 + 配置文件定制化}

框架已经对基础的代码进行了封装并提供相应的API,开发者在使用框架是直接调用封装好的API可以省去很多代码编写,从而提高工作效率和开发速度。

组件交给Spring管理优势

  1. 降低了组件之间的耦合性:Spring IoC容器通过依赖注入机制,将组件之间的依赖关系削弱,减少了程序组件之间的耦合性,使得组件更加松散地耦合。
  2. 提高了代码的可重用性和可维护性:将组件的实例化过程、依赖关系的管理等功能交给Spring IoC容器处理,使得组件代码更加模块化、可重用、更易于维护。
  3. 方便了配置和管理:Spring IoC容器通过XML文件或者注解,轻松的对组件进行配置和管理,使得组件的切换、替换等操作更加的方便和快捷。
  4. 交给Spring管理的对象(组件),方可享受Spring框架的其他功能(AOP,声明事务管理)等

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1465644.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Electron实战之环境搭建

工欲善其事必先利其器&#xff0c;在进行实战开发的时候&#xff0c;我们最终的步骤是搞好一个舒服的开发环境&#xff0c;目前支持 Vue 的 Electron 工程化工具主要有 electron-vue、Vue CLI Plugin Electron Builder、electron-vite。 接下来我们将分别介绍基于 Vue CLI Plu…

DataDreamer:让创建自定义数据集轻松无比!还自带标注!

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ 内容可能会不定期更新&#xff0c;官网内容都是最新的&#xff0c;请查看首发地址链接。 ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是Ash…

数字信号处理:傅里叶分析

本文主要参考视频如下&#xff1a; 数字信号处理9-1_线性时不变系统对复指数信号的响应_哔哩哔哩_bilibili 傅里叶分析的主要研究内容如下所示&#xff1a; 注意&#xff0c;计算机中使用的离散傅里叶变换并不是离散时间傅里叶变换&#xff1b; 前四种都是理论上的变换方式&…

Graphpad Prism10.2.0(329) 安装教程 (含Win/Mac版)

GraphPad Prism GraphPad Prism是一款非常专业强大的科研医学生物数据处理绘图软件&#xff0c;它可以将科学图形、综合曲线拟合&#xff08;非线性回归&#xff09;、可理解的统计数据、数据组织结合在一起&#xff0c;除了最基本的数据统计分析外&#xff0c;还能自动生成统…

springboot大学生体质测试管理系统源码和论文

大学生体质测试管理系统提供给用户一个简单方便体质测试管理信息&#xff0c;通过留言区互动更方便。本系统采用了B/S体系的结构&#xff0c;使用了java技术以及MYSQL作为后台数据库进行开发。系统主要分为系统管理员、教师和用户三个部分&#xff0c;系统管理员主要功能包括首…

vue-router 三级路由,路由跳转页面异常白屏或404,或刷新三级路由页面后一级和二级路由菜单丢失

问题描述 情况1. vue-router 定义三级路由&#xff0c;路由跳转了&#xff0c;页面404或者白屏情况2. 点击菜单三级路由后&#xff0c;刷新页面后一级和二级路由菜单丢失 解决方案&#xff1a; 某些时候是因为二级和三级的路由共用router-view&#xff0c;可以使用router-vi…

【MySQL系列 04】深入浅出索引

一、索引介绍 提到数据库索引&#xff0c;相信大家都不陌生&#xff0c;在日常工作中会经常接触到。比如某一个 SQL 查询比较慢&#xff0c;分析完原因之后&#xff0c;你可能就会说“给某个字段加个索引吧”之类的解决方案。 但到底什么是索引&#xff0c;索引又是如何工作的…

Vue | (四)使用Vue脚手架(上) | 尚硅谷Vue2.0+Vue3.0全套教程

文章目录 &#x1f4da;初始化脚手架&#x1f407;创建初体验&#x1f407;分析脚手架结构&#x1f407;关于render&#x1f407;查看默认配置 &#x1f4da;ref与props&#x1f407;ref属性&#x1f407;props配置项 &#x1f4da;混入&#x1f4da;插件&#x1f4da;scoped样…

抖音爬虫批量视频提取功能介绍|抖音评论提取工具

抖音爬虫是指通过编程技术从抖音平台上获取视频数据的程序。在进行抖音爬虫时&#xff0c;需要注意遵守相关法律法规和平台规定&#xff0c;以确保数据的合法获取和使用。 一般来说&#xff0c;抖音爬虫可以实现以下功能之一&#xff1a;批量视频提取。这个功能可以用于自动化地…

Lua速成(2)

一、流程控制 Lua 编程语言流程控制语句通过程序设定一个或多个条件语句来设定。在条件为 true 时执行指定程序代码&#xff0c;在条件为 false 时执行其他指定代码。 控制结构的条件表达式结果可以是任何值&#xff0c;Lua认为false和nil为假&#xff0c;true和非nil为真。 …

模拟、排序(归并排序)算法

模拟、排序算法 一、模拟例题1、错误票据题目信息思路题解 2、回文日期题目信息思路方法一&#xff1a;暴力做法方法二&#xff1a;优化解法 题解方法一&#xff1a;暴力求解方法二&#xff1a;优化解法 二、排序例题1、归并排序题目信息思路题解 一、模拟 例题 1、错误票据 …

AI副业项目分享

在上一篇文章《这才是大学生该做的副业&#xff0c;别再痴迷于游戏了&#xff01;》中&#xff0c;我分享了一些副业的想法&#xff0c;接着有不少同学问我&#xff1a;具体如何做&#xff1f;这是真把我给整蒙了&#xff0c;这里分享下我可以提供的产品和服务吧&#xff0c;并…

实用区块链应用:去中心化投票系统的部署与实施

一、需求分析背景 随着技术的发展&#xff0c;传统的投票系统面临着越来越多的挑战&#xff0c;如中心化控制、透明度不足和易受攻击等问题。为了解决这些问题&#xff0c;我们可以利用区块链技术去中心化、透明性和安全性来构建一个去中心化投票系统。这样的系统能够确保投票过…

【某机构vip教程】python(6):python读取ini的配置文件

python读取ini的配置文件 configparser模块简介&#xff1a; configparser模块是用来解析ini配置文件的解析器。 ini配置文件的结构如x下图 ini文件结构需要注意以下几点&#xff1a; 键值对可用或者:进行分隔 section的名字是区分大小写的,而key的名字是不区分大小写的 …

Redis(十五)Bitmap、Hyperloglog、GEO案例、布隆过滤器

文章目录 面试题常见统计类型聚合统计排序统计二值统计基数统计 Hyperloglog专有名词UV&#xff08;Unique Visitor&#xff09;独立访客PV&#xff08;Page View&#xff09;页面浏览量DAU&#xff08;Daily Active User&#xff09;日活跃用户量MAU&#xff08;Monthly Activ…

【2024软件测试面试必会技能】Appium自动化(6):原生app元素定位方法

元素定位方法介绍及应用&#xff1a; Appium方法定位原生app元素: 通过appium inspector工具&#xff0c;可以获取元素的相关信息&#xff1b;在appium中提供了一系列的元素定位API&#xff0c;通过在这些API中输入指定的元素信息&#xff0c;就能完成元素定位&#xff0c;定…

学习Redis基础篇

1.初识Redis 1.认识NoSQL 2.认识Redis 3.连接redis命令 4.数据结构的介绍 5.通用命令 2.数据类型 1.String类型 常见命令&#xff1a;例子&#xff1a;set key value

【Linux 内核源码分析】内存管理——伙伴分配器

在Linux操作系统中&#xff0c;内存分配通常由内核中的内存管理模块完成。以下是三个主要的内存分配器&#xff1a; 伙伴系统 (Buddy System)&#xff1a;这是内核中最基本的分配器&#xff0c;用于分配物理内存。伙伴系统将内存块组织成不同大小的伙伴&#xff0c;以便有效地分…

电脑c盘太满了怎么办?5个必备的好方法~

随着我们在电脑上存储和安装越来越多的文件和程序&#xff0c;C盘的空间可能会迅速减少&#xff0c;甚至变得过于拥挤。当C盘空间不足时&#xff0c;会影响电脑的运行速度和性能&#xff0c;甚至导致系统崩溃。本文将介绍一些解决C盘空间不足问题的方法&#xff0c;帮助你更好地…

git中将所有修改的文件上传到暂存区

案例&#xff1a; 我将本地的多个文件进行了修改&#xff0c;导致文件发生了变化。使用git status命令&#xff0c;查看文件的状态&#xff0c;发现有多个文件是modified&#xff0c;即被修改了。 本地文件发生了变化&#xff0c;需要将modified的文件添加到暂存区&#xff0c…