Spring学习总结【二】---IoC(控制反转)

2023-11-13

IoC理论推导

在我们之前的业务中,用户的需求可能会影响我们原来的代码,我们需要根据用户的需求去修改原代码,如果程序代码量十分大,修改一次的成本代价十分昂贵!

在这里插入图片描述

  • 之前,程序是主动创建对象,控制权在程序猿手上。
  • 使用了set注入后,程序不再具有主动性,而是变成了被动的接受对象。

这种思想,从本质上解决了问题,我们程序猿不用再去管理对象的创建了。系统的耦合性大大降低,可以更加专注的在业务的实现上!
这是IOC的原型!

IoC本质

控制反转IoC(Inversion of Control),是一种设计思想,Dl(依赖注入)是实现loC的一种方法,也有人认为DI只是loC的另一种说法。
没有loC的程序中,我们使用面向对象编程,对象的创建与对象间的依赖关系完全硬编码在程序中,对象的创建由程序自己控制。
控制反转后将对象的创建转移给第三方,个人认为所谓控制反转就是:获得依赖对象的方式反转了。

采用XML方式配置Bean的时候,Bean的定义信息是和实现分离的,而采用注解的方式可以把两者合为一体,Bean的定义信息直接以注解的形式定义在实现类中,从而达到了零配置的目的。

控制反转是一种通过描述(XML或注解)并通过第三方去生产或获取特定对象的方式。在Spring中实现控制反转的是loC容器,其实现方法是依赖注入(Dependency Injection,Dl)。

我们知道,控制反转核心思想就是由 Spring 负责对象的创建。在对象创建过程中,Spring 会自动根据依赖关系,将它依赖的对象注入到当前对象中,这就是所谓的“依赖注入”。

控制:谁来控制对象的创建,传统应用程序的对象是由程序本身控制创建的,使用Spring后,对象是由Spring来创建的.
反转:程序本身不创建对象,而变成被动的接收对象.依赖注入:就是利用set方法来进行注入的.

IOC是一种编程思想,由主动的编程变成被动的接收.

可以通过newClassPathXmlApplicationContext去浏览一下底层源码.

OK,到了现在,我们彻底不用再程序中去改动了,要实现不同的操作,只需要在xml配置文件中进行修改,所谓的loC,一句话搞定:对象由Spring 来创建,管理,装配!

工作原理

IoC 底层通过工厂模式、Java 的反射机制、XML 解析等技术,将代码的耦合度降低到最低限度,其主要步骤如下。

  • 在配置文件(例如 Bean.xml)中,对各个对象以及它们之间的依赖关系进行配置;
  • 我们可以把 IoC 容器当做一个工厂,这个工厂的产品就是 Spring Bean;
  • 容器启动时会加载并解析这些配置文件,得到对象的基本信息以及它们之间的依赖关系;
  • IoC 利用 Java 的反射机制,根据类名生成相应的对象(即 Spring Bean),并根据依赖关系将这个对象注入到依赖它的对象中。
    在这里插入图片描述

IoC创建对象的方式

  • 1.使用无参构造创建对象,默认!
  • 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="user" class="pojo.User">
        <constructor-arg index="0" value="张三"/>
    </bean>
    

</beans>

  • 2.通过类型创建,不建议使用
 <bean id="user" class="pojo.User">
    <constructor-arg type="java.lang.String" value="张三"/>
 </bean>
  • 3.直接通过参数名来设置
<bean id="user" class="pojo.User">
   <constructor-arg name="name" value="张三"/>
</bean>

在配置文件加载的时候,容器中管理的对象就已经初始化了。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring学习总结【二】---IoC(控制反转) 的相关文章

  • 如何使用 FileChannel 将一个文件的内容附加到另一个文件的末尾?

    File a txt好像 ABC File d txt好像 DEF 我正在尝试将 DEF 附加到 ABC 所以a txt好像 ABC DEF 我尝试过的方法总是完全覆盖第一个条目 所以我总是最终得到 DEF 这是我尝试过的两种方法 File
  • 我需要在 Spring 中检查每个控制器中的有效会话吗? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设在 Spring Mvc 的 Web 应用程序中 我们是否需要检查每个控制器或 jsps 中的有效会话 我该如何解决 MVC 中的
  • 在Windows上安装Java 11 OpenJDK(系统路径问题)

    Java 11 最近发布了 众所周知 这个版本没有安装文件 当然 要在没有安装程序的情况下安装 Java 我将系统设置 PATH 和 JAVA HOME 设置为解压缩 Java 11 的文件夹的地址 根据对类似问题的已接受回复建议 唯一的事
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • Java8无符号算术

    据广泛报道 Java 8 具有对无符号整数的库支持 然而 似乎没有文章解释如何使用它以及有多少可能 有些函数 例如 Integer CompareUnsigned 很容易找到 并且似乎可以实现人们所期望的功能 但是 我什至无法编写一个简单的
  • 在数据流模板中调用 waitUntilFinish() 后可以运行代码吗?

    我有一个批处理 Apache Beam 作业 它从 GCS 获取文件作为输入 我的目标是根据执行后管道的状态将文件移动到两个 GCS 存储桶之一 如果管道执行成功 则将文件移动到存储桶 A 否则 如果管道在执行过程中出现任何未处理的异常 则
  • java中删除字符串中的特殊字符?

    如何删除字符串中除 之外的特殊字符 现在我用 replaceAll w s 它删除了所有特殊字符 但我想保留 谁能告诉我我该怎么办 Use replaceAll w s 我所做的是将下划线和连字符添加到正则表达式中 我添加了一个 连字符之前
  • jdbc4.MySQLSyntaxErrorException:数据库中不存在表

    我正在使用 SpringBoot 开发一个网络应用程序 这是我的application properties文件来指定访问数据库的凭据 spring datasource driverClassName com mysql jdbc Dri
  • Spring引导@Transactional

    spring boot会自动在controller层添加 Transactional注解吗 我尝试将 Transactional 放在服务层 但似乎控制器层覆盖了注释 我有这个配置
  • 无法理解 Java 地图条目集

    我正在看一个 java 刽子手游戏 https github com leleah EvilHangman blob master EvilHangman java https github com leleah EvilHangman b
  • 迁移到 java 17 后有关“每个进程的内存映射”和 JVM 崩溃的 GC 警告

    我们正在将 java 8 应用程序迁移到 java 17 并将 GC 从G1GC to ZGC 我们的应用程序作为容器运行 这两个基础映像之间的唯一区别是 java 的版本 例如对于 java 17 版本 FROM ubuntu 20 04
  • 检查 Android 手机上的方向

    如何查看Android手机是横屏还是竖屏 当前配置用于确定要检索的资源 可从资源中获取Configuration object getResources getConfiguration orientation 您可以通过查看其值来检查方向
  • Spring Data 与 Spring Data JPA 与 JdbcTemplate

    我有信心Spring Data and Spring Data JPA指的是相同的 但后来我在 youtube 上观看了一个关于他正在使用JdbcTemplate在那篇教程中 所以我在那里感到困惑 我想澄清一下两者之间有什么区别Spring
  • 如何在 JFreeChart TimeSeries 图表上显示降雨指数和温度?

    目前 我的 TimeSeries 图表每 2 秒显示一个位置的温度 现在 如果我想每2秒显示一次降雨指数和温度 我该如何实现呢 这是我的代码 import testWeatherService TestWeatherTimeLapseSer
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • 运行 Jar 文件时出现问题

    我已将 java 项目编译成 Jar 文件 但运行它时遇到问题 当我跑步时 java jar myJar jar 我收到以下错误 Could not find the main class myClass 类文件不在 jar 的根目录中 因
  • Java - 不要用 bufferedwriter 覆盖

    我有一个程序可以将人员添加到数组列表中 我想做的是将这些人也添加到文本文件中 但程序会覆盖第一行 因此这些人会被删除 如何告诉编译器在下一个空闲行写入 import java io import java util import javax
  • 如何测试 spring-security-oauth2 资源服务器安全性?

    随着 Spring Security 4 的发布改进了对测试的支持 http docs spring io spring security site docs 4 0 x reference htmlsingle test我想更新我当前的
  • com.jcraft.jsch.JSchException:身份验证失败

    当我从本地磁盘上传文件到远程服务器时 出现这样的异常 com jcraft jsch JSchException Auth fail at org apache tools ant taskdefs optional ssh Scp exe

随机推荐

  • add_subdirectory(子文件夹名)用法

    add subdirectory 子文件夹名 表示对子文件夹项目进行cmake编译
  • redis命令之哈希表类型hdel命令用法详情

    哈希表 HDEL命令 命令 hdel key field field field 同时删除N个field 对于不存在的field会被忽略 并返回被删除的field的个数 当在该key下的最后一个field也被删除掉的话 再通过hget ke
  • 设计模式(2)之单例模式

    外链图片转存失败 源站可能有防盗链机制 建议将图片保存下来直接上传 img AHenjiIs 1610326440502 https img shields io badge link 996 icu red svg 单例模式 顾名思义就是
  • 数据库表结构设计

    数据库表结构设计 一 数据库 二 数据库类型 三 设计步骤 四 表设计 本来最近不想写东西的 奈何平台给推了个流量券 一 数据库 简而言之就是 存储数据的一个容器 常见的数据库软件有MySQL Oracle SQL Server Postg
  • python的下载和安装步骤,python下载安装教程3.10.0

    大家好 给大家分享一下python下载安装教程3 10 0 很多人还不知道这一点 下面详细解释一下 现在让我们来看看 第一步 下载Python安装包 在Python的官网 www python org 中找到最新版本的Python安装包 点
  • 企业级springboot项目架构模板V2.0,开箱即用

    此次 2 0 更新点 1 优化 Controller 接口入参 post 和 put 接口使用 json 格式入参 2 日志服务 quick log serve 增加查询操作日志列表接口 3 quick log serve 服务会记录需要鉴
  • Linux命令_lsof & 网络/文件监控

    官方描述 一个打开的文件可以是一个常规文件 一个目录 一个块特殊文件 一个字符特殊文件 一个执行文本引用 一个库 一个流或一个网络文件 Internet套接字 NFS文件或UNIX域套接字 可以通过路径选择文件系统中的某个文件 也可以选择文
  • Python数据可视化的例子——条形图(bar)

    1 matplotlib模块 应用matplotlib模块绘制条形图 需要调用bar函数 关于该函数的语法和参数含义如下 bar x height width 0 8 bottom None color None edgecolor Non
  • Axure RP 9软件安装步骤

    1 官网下载软件 第一步 点击安装文件 建议安装到D盘 请记住具体安装位置 后续汉化需要用到 本人实际位置 D Program Files x86 Axure Axure RP 9 第二步 激活 打开软件中的激活 第三步 汉化 复制汉化文件
  • discuz数据库密码修改

    在源码config目录下找到这两个文件 然后打开修改密码
  • [开发过程]<软件设计>UML建模初体验

    0 引言 前文提到UML的相关工具 前文链接如下 开发过程 软件设计 关于统一建模语言UML 崭蓝码农的博客 CSDN博客从某一个需求出发 开发中有4个重点问题 1 业务逻辑 2 程序逻辑 3 各进程之间的关系 4 物理实现 为了根据需求
  • 【AI工具】 一款多SOTA模型集成的高精度自动标注工具(直接安装使用,附源码)

    目录 高精度自动标注工具简介及其特性 标注工具的安装 开启自动标注 简介 X AnyLabeling 是一款全新的交互式自动标注工具 其基于AnyLabeling进行构建和二次开发 在此基础上扩展并支持了许多的模型和功能 并借助Segmen
  • java--基础--21.2--注解--案例

    java 基础 21 2 注解 案例 1 类注解 可以在运行时获取类 方法或字段的注解 下面是获取类注解的示例 Class aClass TheClass class Annotation annotations aClass getAnn
  • jar包快速启动和远程监听

    jar包快速启动 制作bat文件 设置窗口背景和字体颜色 设置窗口大小 设置启动内存大小 设置依赖lib文件路径 设置远程debug 制作bat文件 if root set root d root cd root jar bat color
  • STM32的12位ADC过采样实现16位分辨率

    1 什么是过采样 过采样技术是一种以牺牲采样速度来提高ADC分辨率的技术 部分STM32单片机是支持硬件过采样的 如STM32G0系列 通过过采样 可以将12位的ADC提升到16位 非常实用 根据过采样技术 每提高1位ADC分辨率 需要增加
  • CSV文件简介及C++实现

    逗号分隔值 Comma Separated Values CSV 有时也称为字符分隔值 因为分隔字符也可以不是逗号 其文件以纯文本形式存储表格数据 数字和文本 纯文本意味着该文件是一个字符序列 不含必须象二进制数字那样被解读的数据 CSV文
  • Java之继承

    继承 继承 为什么使用继承 继承是什么 继承的语法 访问父类成员 访问父类成员变量 访问父类成员方法 super关键字 子类构造方法 super和this 异同 分别的使用方法 继承的方式 final关键字 作者简介 zoro 1 目前大一
  • 解决安装android studio时用户文件夹为中文名

    第一步 使用登陆管理员账号登陆电脑 更改c盘用户文件夹的名字 创建管理员账户 百度经验 第二步 win r调出运行界面 输入regedit 依此进入 HKEY LOCAL MACHINE SOFTWARE Microsoft Windows
  • Python读取Excel,日期列读出来是数字的处理

    Python读取Excel 里面如果是日期 直接读出来是float类型 无法直接使用 通过判断读取表格的数据类型ctype 进一步处理 返回的单元格内容的类型有5种 ctype 0 empty 1 string 2 number 3 dat
  • Spring学习总结【二】---IoC(控制反转)

    文章目录 IoC理论推导 IoC本质 工作原理 IoC创建对象的方式 IoC理论推导 在我们之前的业务中 用户的需求可能会影响我们原来的代码 我们需要根据用户的需求去修改原代码 如果程序代码量十分大 修改一次的成本代价十分昂贵 之前 程序是