Spring中IOC详解

2023-10-27

一、IOC的原型

IOC ----控制反转
在这里插入图片描述

比如我们有一个功能是获取用户数据,我们使用Dao层实现这个功能,再在Service层调用这个功能。但是我们每增加一个接口,比如获取mysql中的数据,就要修改原来的代码,如果再增加一个新的接口,又需要去service实现类中修改对应的实现。

解决方法

        用户实际调用的是业务层,dao层他们不需要接触
        UserServiceImpl userService = new UserServiceImpl();
        userService.setUserDao(new UserDaoImpl());
        userService.getUser();

利用set,我们可以通过传入参数,指定实现的是哪个接口。已经发生了根本性的变化 , 很多地方都不一样了 . 仔细去思考一下 , 以前所有东西都是由程序去进行控制创建 , 而现在是由我们自行控制创建对象 , 把主动权交给了调用者 . 程序不用去管怎么创建,怎么实现了 . 它只负责提供一个接口。

这种思想 , 从本质上解决了问题 , 我们程序员不再去管理对象的创建了 , 更多的去关注业务的实现 . 耦合性大大降低 . 这也就是IOC的原型 !

二、 IOC本质

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

在这里插入图片描述
IoC是Spring框架的核心内容,使用多种方式完美的实现了IoC,可以使用XML配置,也可以使用注解,新版本的Spring也可以零配置实现IoC。
Spring容器在初始化时先读取配置文件,根据配置文件或元数据,创建并组织对象存入容器中,程序使用时再从Ioc容器中取出需要的对象。

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

三、实现一个简单的HelloSpring 理解IOC

  1. 导入spring依赖的jar包
    <dependencies>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.14</version>
        </dependency>
    </dependencies>
  1. 编写一个Hello实体类
package com.lding.pojo;

public class Hello {
    private String str;
    public String getStr() {
        return str;
    }
    public void setStr(String str) {
        this.str = str;
    }
    @Override
    public String toString() {
        return "Hello{" +
                "str='" + str + '\'' +
                '}';
    }
    public void show(){
        System.out.println("Hello,"+str);
    }
}

  • 编写我们的spring文件 , 这里我们命名为beans.xml
<?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="hello" class="com.lding.pojo.Hello">
        <property name="str" value="Spring111"></property>
    </bean>
</beans>
  • 使用Spring来创建对象,在Spring这些都称为Bean
  • id=变量名
  • class 相当于new 的类
  • property 相当于给对象中的属性赋值
  1. 测试
public class MyTest {
    public static void main(String[] args) {
        //解析beans.xml文件,生成管理相应的Bean对象
        ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
        //getBean:参数即为spring配置文件中的bean的id
        Hello hello = (Hello) context.getBean("hello");
        hello.show();
    }
}

运行结果
在这里插入图片描述

四、 思考

  • Hello 对象是谁创建的 ? 【 hello 对象是由Spring创建的 】
  • Hello 对象的属性是怎么设置的 ? 【hello 对象的属性是由Spring容器设置的 】
    这个过程就叫控制反转 :
  • 控制 : 谁来控制对象的创建 , 传统应用程序的对象是由程序本身控制创建的 , 使用Spring后 , 对象是由Spring来创建的
  • 反转 : 程序本身不创建对象 , 而变成被动的接收对象 .
  • 依赖注入 : 就是利用set方法来进行注入的.
  • IOC是一种编程思想,由主动的编程变成被动的接收

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

如果对您有帮助,免费的赞点一个~~~感谢

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

Spring中IOC详解 的相关文章

随机推荐

  • 详解Nodejs中的模块化

    Nodejs是一个基于Chrome V8引擎的JavaScript运行时环境 它允许开发者使用JavaScript在服务器端运行代码 在Nodejs中 模块化是一种组织和重用代码的重要方式 模块化允许我们将代码拆分成小块 使得代码结构更清晰
  • Windows10访问Ubuntu子系统(WSL)的桌面环境

    Windows10访问Ubuntu子系统 WSL 的桌面环境 文章目录 Windows10访问Ubuntu子系统 WSL 的桌面环境 Why Linux Why WSL 开启WSL Ubuntu换源 更新与升级 安装桌面环境xubuntu
  • Pytorch-YOLOV4-火焰目标检测

    首先感谢大佬提供的代码bubbliiiing 0 效果展示 1 所需环境 torch 1 2 0 2 注意事项 代码中的yolo4 weights pth是基于608x608的图片训练的 代码中的默认anchors是基于608x608的图片
  • SystemC在Ubuntu16.04上安装测试

    使用SystemC进行硬件仿真 环境 linux x86 64 bash g 下载解压SystemC SystemC下载地址 解压下载的包 tar zxvf systemc 2 3 3 tar gz 进入解压出来的目录 准备编译安装 cd
  • 自动控制原理快速入门+理解

    用最简单的话认识全貌 PS 默认都是线性系统 即输入和输出之间是线性的 默认你知道什么是线性 初步认识控制 假设你在推箱子 你推的力气是 f f f 箱子位移是 x x x 质量是
  • 09-----检测对方网络是否正常在线的方法

    1 使用ping ping是我们经常检测对方能否正常通信的方法 它使用的协议是传输层中的ICMP 下面是我自己抓包的内容 2 使用telnet telnet一般是检测某个端口是否开放 格式为 telnet ip port 3 使用nc命令
  • 汇编语言DW、DB和DD的区别

    DW 是定义2字节空间的意思 DW属于汇编的一个伪指令 DW定义字类型变量 一个字数据占2个字节单元 读完一个 偏移量加2 DB定义字节类型变量 一个字节数据占1个字节单元 读完一个 偏移量加1 DD定义双字类型变量 一个双字数据占4个字节
  • 7.26 二进制练习题

    给你个礼物你能收到吗 打开这个exe文件后 我们看到了它让我们输入礼物提取码 我们先随便输入数据 按回车显示提取码错误还有输错的次数 我们发现这里存在着一个循环 然后我们在IDA里面打开这个文件 int cdecl main int arg
  • 大模型微调代码解析,哪些方法可以加速训练?

    近期大模型层出不穷 大家对于大模型的微调也在跃跃欲试 像Lijia的BELLE 斯坦福的Alpaca 1 清华的ChatGLM 2 中文的Chinese Vicuna 3 让我这样的普通玩家也能训练自己的微调模型 在微调和推理的时候仍然需要
  • Vim快速教程

    Vim快速教程 Vim教程 vimtutor 命令模式 Esc 视图模式 v 编辑模式 i Vim plug Vim教程 vimtutor 命令模式 Esc 快捷键 全称 功能 H J K L 方向键 前面加数字代表移动多少行或列 synt
  • 使用docker部署mysql

    1 拉取mysql 最新版本mysql docker pull mysql latest 拉取5 7版本mysql docker pull mysql 5 7 2 启动容器镜像 docker run id name mysql p 3307
  • Android Shape 的使用

    目录 什么是Shape shape属性 子标签属性 corners 圆角 solid 填充色 gradient 渐变 stroke 描边 padding 内边距 size 大小 特殊属性 rectangle 矩形 oval 椭圆 line
  • 如何在pycharm格式化请求头信息

    如何在pycharm格式化请求头信息 1 以格式化文档形式存放请求头信息 2 使用快捷键Ctrl r 输入 替换 1 2 点击Replace all 3 第2步 完成效果如下 4 去掉文档字符串的引号 使用快捷键Ctrl Alt L 让它变
  • TCP连接的状态详解以及故障排查

    1 TCP状态 LISTENING 侦听来自远方的TCP端口的连接请求 首先服务端需要打开一个socket进行监听 状态为LISTEN 有提供某种服务才会处于LISTENING状态 TCP状态变化就是某个端口的状态变化 提供一个服务就打开一
  • osgEarth的Rex引擎原理分析(九十五)地形变形(Terrain morphing)

    目标 十二 中的问题14 morphing翻译为渐变 或混合 比较合适 先看两张图 左图是使用了Image morphing 右图没有使用 morph的作用是使视域边界处的瓦片颜色和高程均匀变化 Image morphing控制颜色 Ter
  • 强大的PropertyGrid

    PropertyGrid 做工具一定要用这东西 把要编辑的对象看成类的话 所有要编辑的属性就是成员 嗯嗯 最近看了几眼Ogitor 它对于PropertyGrid的使用就很不错 所有要编辑的对象 灯光 模型 粒子等等 都有一个共同的基类 每
  • python 安装第三方库,超时报错--Read timed out.

    Traceback most recent call last File home xiaoduc pyenv versions 3 5 0 lib python3 5 site packages pip vendor requests p
  • OpenGL天空盒skybox

    目录 痛彻的感悟 天空盒可能的难题 天空盒代码 痛彻的感悟 今天考完试才发现自己和别人的差距还挺大的 四五六班下午的考试题目 我很快做了出来 但是自己的班级的考试题目 我竟然一道都没有成功 所以我决定把我之前准备的代码公布一下 也希望对一些
  • 用Python写一个植物大战僵尸

    上次写了一个俄罗斯方块 感觉好像大家都看懂了 这次就更新一个植物大战僵尸吧 植物大战僵尸的话 Python源码 问题解答学习交流群 773162165 引入需要的模块 import pygame import random 配置图片地址 I
  • Spring中IOC详解

    一 IOC的原型 IOC 控制反转 比如我们有一个功能是获取用户数据 我们使用Dao层实现这个功能 再在Service层调用这个功能 但是我们每增加一个接口 比如获取mysql中的数据 就要修改原来的代码 如果再增加一个新的接口 又需要去s