【Spring 核心 | IoC】

news2024/10/6 10:30:59

IoC

  • IoC 简介
    • 定义:
    • IoC 和 DI
    • Bean
    • IoC 容器
    • Ioc
  • IoC容器

IoC 简介

定义:

  IoC即控制反转(Inversion of Control,缩写为 IoC)。IoC又称为依赖倒置原则(设计模式六大原则之一)。
IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。这样对象的控制权就反转了,你无需关心对象的各种创建,只需关注业务的本身,大大降低了程序的耦合性。
它的要点在于:程序要依赖于抽象接口,不要依赖于具体实现。它的作用就是用于降低代码间的耦合度。

IoC 的实现方式有两种:

  • 依赖注入(Dependency Injection,简称 DI):不通过 new() 的方式在类内部创建依赖类对象,而是将依赖的类对象在外部创建好之后,通过构造函数、函数参数等方式传递(或注入)给类使用。
  • 依赖查找(Dependency Lookup):容器中的受控对象通过容器的 API 来查找自己所依赖的资源和协作对象。

理解 Ioc 的关键是要明确两个要点:

谁控制谁,控制什么:传统 Java SE 程序设计,我们直接在对象内部通过 new 进行创建对象,是程序主动去创建依赖对象;而 IoC 是有专门一个容器来创建这些对象,即由 Ioc 容器来控制对象的创建;谁控制谁?当然是 IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
在这里插入图片描述

IoC 和 DI

  本质是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以 2004 年大师级人物 Martin Fowler 又给出了一个新的名字:“依赖注入”,相对 IoC 而言,“依赖注入”明确描述了“被注入对象依赖 IoC 容器配置依赖对象”。

注:如果想要更加深入的了解 IoC 和 DI,请参考 Martin Fowler 的一篇经典文章 。
Inversion of ControlContainers and the Dependency Injection pattern (opens new window)

Bean

JavaBean是一种 JAVA 语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 对外部通过提供 getter / setter方法来访问其成员。

  由 IoC 容器管理的那些组成你应用程序的对象我们就叫它 Bean。Bean 就是由 Spring 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中的其他对象没有什么区别了。那 IoC 怎样确定如何实例化 Bean、管理 Bean 之间的依赖关系以及管理 Bean 呢?这就需要配置元数据,在 Spring 中由 BeanDefinition 代表。

IoC 容器

  IoC 顾名思义就是有依赖注入能力的容器。它负责负责实例化、配置和组装 bean。容器通过读取配置元数据获取有关要实例化、配置和组装哪些对象的指令。配置元数据以 XML、Java 注释或 Java 代码表示。

Ioc

  IoC 容器中的对象仅通过构造函数参数、工厂方法的参数或在对象实例被构造或从工厂方法返回后设置的属性来定义它们的依赖关系(即它们使用的其他对象) .然后容器在创建 bean 时注入这些依赖项。这个过程基本上是 bean 本身的逆过程(因此得名,控制反转),它通过使用类的直接构造或服务定位器模式等机制来控制其依赖项的实例化或位置。

org.springframework.beans org.springframework.是 IoC 容器的基础。

IoC容器

在 Spring 中,有两种 IoC 容器:BeanFactoryApplicationContext

  • BeanFactoryBeanFactory 是 Spring 基础 IoC 容器。BeanFactory提供了 Spring 容器的配置框架和基本功能。
  • ApplicationContextApplicationContext是具备应用特性的 BeanFactory的子接口。它还扩展了其他一些接口,以支持更丰富的功能,如:国际化、访问资源、事件机制、更方便的支持 AOP、在 web 应用中指定应用层上下文等。

  实际开发中,更推荐使用 ApplicationContext作为 IoC 容器,因为它的功能远多于 BeanFactory
org.springframework.context.ApplicationContext 接口代表 Spring IoC 容器,负责实例化、配置和组装 bean。容器通过读取配置元数据来获取关于要实例化、配置和组装哪些对象的指令。配置元数据以 XML、Java 注释或 Java 代码表示。它允许您表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。

下图是容器的工作原理:
在这里插入图片描述

共分为三步 :
配置元数据 :Spring IoC 容器使用一种形式的配置元数据。此配置元数据表示您作为应用程序开发人员如何告诉 Spring 容器在您的应用程序中实例化、配置和组装对象。配置元数据传统上以简单直观的 XML 格式提供。
实例化容器:由 IoC 容器解析配置的元数据。IoC 容器的 Bean Reader 读取并解析配置文件,根据定义生成 BeanDefinition 配置元数据对象,IoC 容器根据BeanDefinition进行实例化、配置及组装 Bean。
使用容器:由客户端实例化容器,获取需要的 Bean。

在这里插入图片描述

  如果喜欢的话,欢迎 🤞关注 👍点赞 💬评论 🤝收藏  🙌一起讨论
  你的评价就是我✍️创作的动力!					  💞💞💞

参考:
spring官方文档

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

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

相关文章

走近mysql运算符|靠它就够啦

这里写目录标题 比较运算符的使用等号运算符<>安全等于不等于运算符<>/!非符号类型的运算符BETWEEN ANDINLIKEPEGEXP/ RLIKE 逻辑运算符使用位运算符 比较运算符的使用 等号运算符 判断等号两边的值&#xff0c;字符串或表达式是否相等&#xff0c;如果相等则返回…

Hadoop/Hive/Spark小文件处理

什么是小文件&#xff1f; 小文件指的是文件size比HDFS的block size小很多的文件。Hadoop适合处理少量的大文件&#xff0c;而不是大量的小文件。 hadoop小文件常规的处理方式 1、小文件导致的问题 首先&#xff0c;在HDFS中&#xff0c;任何block&#xff0c;文件或者目录…

吴恩达471机器学习入门课程1第1周——梯度下降

文章目录 1加载数据集2计算COST(均值平方差&#xff0c;1/2m(y_pre - y))3计算梯度4画出成本曲线5梯度下降 import math, copy import numpy as np import matplotlib.pyplot as plt plt.style.use(./deeplearning.mplstyle) from lab_utils_uni import plt_house_x, plt_conto…

华为OD机试真题 JavaScript 实现【找出通过车辆最多颜色】【2023Q1 100分】

一、题目描述 在一个狭小的路口&#xff0c;每秒只能通过一辆车&#xff0c;假如车辆的颜色只有3种&#xff0c;找出n秒内经过的最多颜色的车辆数量。 三种颜色编号为0、1、2。 二、输入描述 第一行输入的是通过的车辆颜色信息 [0 1 1 2] 代表4秒钟通过的车辆颜色分别是0 1…

手把手教你使用CONN(预处理)

CONN软件介绍 &#xff08;1&#xff09;CONN是一个基于Matlab的跨平台软件&#xff0c;用于计算、显示和分析功能磁共振成像&#xff08;fcMRI&#xff09;中的功能连通性。也可用于静息状态数据&#xff08;rsfMRI&#xff09;以及任务相关设计。 &#xff08;2&#xff09…

Vue的组合式

1. 概念 选项式API&#xff1a;将相同类型的代码放在一起&#xff08;比如所有数据、所有用到的方法等等&#xff09;当代码业务板块过多时&#xff0c;不方便写代码和后期维护 组合式API&#xff1a;将同一业务的相关代码放在一起&#xff08;比如说数据&#xff0c;方法&am…

什么是同源策略

文章目录 同源策略同源策略的目的同源策略分类 同源策略 同源策略是指浏览器的一种安全机制&#xff0c;用于限制来自不同源&#xff08;即域、协议或端口&#xff09;的文档或脚本之间的交互操作。 根据同源策略&#xff0c;浏览器只允许当前网页与同一源下的其他资源进行交…

Linux之CentOS 7.9部署Oracle 11g r2 静默安装实测验证(无桌面模式)

前言&#xff1a;因前段时间一直部署的windows环境的oracle&#xff0c;这次记录下linux下的部署方式&#xff0c;当然还有更多的其他部署&#xff0c;大家可根据自身环境及学习来了解。一般静默安装主要还是要提前准备源包&#xff0c;还有很多依赖包&#xff0c;另外就是配置…

如何显示文件后缀名,这4个方法很简单!

Anna最近想对电脑里的文件进行分类&#xff0c;但有些未知类型的文件&#xff0c;她想查看文件的类型并进行分类&#xff0c;可是她不知道如何显示文件后缀名&#xff0c;因此向大家求助。 在计算机操作中&#xff0c;文件的后缀名是文件名的一部分&#xff0c;用于标识文件的类…

FlinkSQL写入iceberg—Windows环境下

前置条件 Flink运行版本13.1&#xff0c;iceberg依赖版本&#xff1a;1.0.0 依赖 FlinkSQL运行环境略。 注意版本匹配&#xff0c;采用不合适版本可能导致无法读写。 <!-- Flink 操作Iceberg 需要的Iceberg依赖 --><dependency><groupId>org.apache.iceb…

shell脚本变量-特殊变量

目录 特殊变量&#xff1a;$n案例需求 特殊变量&#xff1a;$#案例需求 特殊变量&#xff1a;$*、$案例需求 特殊变量&#xff1a;$&#xff1f;特殊变量&#xff1a;$$ 特殊变量&#xff1a;$n 语法 $n含义&#xff1a; 用于接收脚本文件执行时传入的参数 $0 用于获取当前脚…

机器人系统中的六大漏洞

原创 | 文 BFT机器人 在过去的几十年里&#xff0c;创新和技术导致机器人技术不断发展。 机器人系统正在迅速变得更加多产、复杂、有能力、智能化和网络化&#xff0c;并被用于越来越多的任务。 最初&#xff0c;机器人技术领域仅限于制造领域&#xff0c;但现在机器人可以与人…

KMP算法 - 确定有限状态自动机

KMP神在哪里&#xff1f; 子串匹配问题&#xff0c;拍脑袋一下子想出来的暴力解法大抵都是两重for循环&#xff0c;不断重复扫描主串&#xff0c;与子窜进行匹配&#xff0c;重复换句话讲就是冗余&#xff0c;会有很高的时间复杂度 我先前博客大作业发的模糊查找算法就是如此&…

三分钟告诉你如何和智能ai聊天

有一个名叫艾丽的年轻女孩&#xff0c;她生活在一个科技发达的未来世界。在这个世界里&#xff0c;人们与人工智能伙伴共同生活。艾丽对ai技术充满好奇&#xff0c;尤其是对ai对话聊天工具的运作方式。为了知道ai对话聊天工具怎么用&#xff0c;艾丽决定展开探索。 方案一&…

智能无线监测器的工作原理及应用优势

在现代工业生产中&#xff0c;设备状态监测对于确保生产的安全性、效率和可靠性至关重要。随着科技的不断发展&#xff0c;智能无线监测器成为工业设备状态监测的利器。本文将介绍智能无线监测器在工业领域中的应用&#xff0c;以及其带来的优势和价值。 图.设备状态监测&#…

智驾风向标|卷、乱、难,如何穿越多极分化新周期?

竞争越来越卷&#xff0c;企业越来越难&#xff0c;市场处于混乱期。对于大多数供应商来讲&#xff0c;穿越新周期的战略一定是先有规模&#xff08;市场份额&#xff09;&#xff0c;然后才是利润。 在6月8日召开的2023&#xff08;第十四届&#xff09;高工智能汽车开发者大…

8个你必须知道的Java8新特性,让你的代码变得优雅!

Java 8 是一次重大的发行版更新&#xff0c;引入了大量新特性和改进&#xff0c;以下是 Java 8 的主要特性&#xff1a; 文章目录 Java 8 是一次重大的发行版更新&#xff0c;引入了大量新特性和改进&#xff0c;以下是 Java 8 的主要特性&#xff1a;1.Lambda 表达式2.Stream …

云平台 stm32连接阿里云2023最新版本保姆级别教学只看这一篇就够了~

注册账号 阿里云平台点击直达 点击控制台 鼠标悬浮会出现下拉栏 点击物联网 再点击物联网平台 点击公共实例 新用户需要开通 开通需要五分钟的时间 点击创建产品 蓝色显眼字体 参数设置 仔细比对下图 点击查看产品详情 蓝色显眼字体 点击功能定义 点击编辑草图 实际上就是定义…

如何通过Android平台的API实现5G网络的支持 安卓系统版本和5g网络相关【一】

前面分享了两篇5G基带相关的移植修改博文。 安卓高通机型的基带移植 修改 编译的相关 增加信号 支持5G等【一】 安卓高通机型的基带移植 修改 编译的相关 增加信号 支持5G等【二】 今天的帖子聊聊安卓版本与5G网络与机型和修改之间相关的话题。众所周知&#xff0c;目前的机型…

如何获取签章定位信息

在合同系统中&#xff0c;经常需要在合同文档的特定位置放置签名/印章图片。在合同拟稿过程中&#xff0c;放置签名/印章图片只是为了获取一个精确的定位信息&#xff0c;在合同定稿阶段才根据拟稿阶段得到的位置信息&#xff0c;去插入真正的签名/印章。那么如何在合同系统中高…