Spring —— 初学 Spring, 理解控制反转

JavaEE传送门

JavaEE

Servlet —— Smart Tomcat,以及一些访问出错可能的原因

Servlet —— Servlet API


目录

  • Spring
    • IoC (理解控制反转)
      • 传统代码
      • ioc代码
    • DI


Spring

Spring 通常指的是 Spring Farmework (Spring 框架), 它是一个开源框架

用一句话来概括: Spring 是一个包含了众多工具方法的 Ioc 容器.

容器: 就是用来容纳某种物品的装置.

  • List /Map 是数据存储容器

  • Tomcat 是 web 容器

IoC: Inversion of Control (控制反转). 也就是说 Spring 是一个 “控制反转” 的容器.

Spring 是一个 IoC (控制反转) 容器, 他具备两个最基础的功能:

  1. 将对象存到容器(Spring) 中
  2. 从容器(Spring) 中取出对象

IoC (理解控制反转)

IoC: Inversion of Control (控制反转).

假如我们要构造一只 “” 的程序, 我们的思路是这样的:

传统代码

# Bird.java

package old;

public class Bird {
    private Feather feather;

    public Bird() {
        feather = new Feather();
    }

    public void init() {
        System.out.println("执行了 bird init() 方法");
        // 依赖羽毛
        feather.init();
    }
}

# Feather.java

public class Feather {
    private Body body;

    public Feather() {
        body = new Body();
    }

    public void init() {
        System.out.println("执行了 feather init() 方法");
        // 依赖身体
        body.init();
    }
}

# Body.java

package old;

public class Body {
    private Claws claws;

    public Body() {
        claws = new Claws();
    }

    public void init() {
        System.out.println("执行了 body init() 方法");
        // 依赖爪子
        claws.init();
    }
}

# Claws.java

package old;

public class Claws {
    public void init() {
        System.out.println("执行了 claws init() 方法");
    }
}

# 测试代码

package old;

public class App {
    public static void main(String[] args) {
        Bird bird = new Bird();
        bird.init();
    }
}

# 运行结果展示

# 此时如果我们想给爪子加一个颜色属性 , 我们更改了 Claws.java 中的代码, Body.java 中的代码也会报错. 我们就需要修改 Body.java , 然后更改 Feather.java…

我们可以看到, 传统代码, 存在耦合性问题.


ioc代码

# Bird.java

package ioc;

public class Bird {
    private Feather feather;

    public Bird(Feather feather) {
        this.feather = feather;
    }

    public void init() {
        System.out.println("执行了 bird init() 方法");
        // 依赖羽毛
        feather.init();
    }
}

# Feather.java

package ioc;

public class Feather {
    private Body body;

    public Feather(Body body) {
        this.body = body;
    }

    public void init() {
        System.out.println("执行了 feather init() 方法");
        // 依赖身体
        body.init();
    }
}

# Body.java

package ioc;

public class Body {
    private Claws claws;

    public Body(Claws claws) {
        this.claws = claws;
    }

    public void init() {
        System.out.println("执行了 body init() 方法");
        // 依赖爪子
        claws.init();
    }
}

# Claws.java

package ioc;

public class Claws {
    
    public Claws() {
    }
    
    public void init() {
        System.out.println("执行了 claws init() 方法");
    }
}

# 测试代码

package ioc;

public class App {
    public static void main(String[] args) {
        Claws claws = new Claws();
        Body body = new Body(claws);
        Feather feather = new Feather(body);
        Bird bird = new Bird(feather);
        bird.init();
    }
}

# 运行结果展示

# 此时如果我们想给爪子加一个颜色属性 , 我们只需更改 Claws.java 中的代码

package ioc;

public class Claws {
    private String color;

    public Claws(String color) {
        this.color = color;
    }
    public void init() {
        System.out.println("执行了 claws init() 方法, color : " + color);
    }
}

之后在测试代码中传入参数.

就可以成功添加属性. 降低了代码的耦合性.

对比

传统代码中对象的创建顺序是: Bird -> Feather -> Body -> Claws

控制反转之后对象的创建顺序是: Claws -> Body -> Feather -> Bird

下级对象把注⼊将当前对象中,下级的控制权不再由上级类控制了,这样即使下级类发⽣任何改变,当前类都是不受影响的,这就是典型的控制反转,也就是 IoC 的实现思想。


DI

DI : Denpendency Injection 的缩写, 翻译过来是 “依赖注入” 的意思. 在程序运行期间, 动态的将某个对象引入到当前的 行为机制.

IoC 和 DI 的关系

  • 从广义上来说:

    IoC = DI , 是从不同的维度来描述同一个问题.

  • 从严格意义上来讲:

    IoC 是一种设计思想, 最终还是要有可行的方案.

    DI 是具体的实现技术.


🌷(( ◞•̀д•́)◞⚔◟(•̀д•́◟ ))🌷

以上就是今天要讲的内容了,希望对大家有所帮助,如果有问题欢迎评论指出,会积极改正!!
在这里插入图片描述
在这里插入图片描述

这里是Gujiu吖!!感谢你看到这里🌬
祝今天的你也
开心满怀,笑容常在。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【linux】Linux基本指令(上)

前言: 在之前我们已经简单了介绍了一下【Linux】,包括它的概念,由来啊等进行了讲解,接下来我们就将正式的踏入对其的学习!!! 本文目录👉操作系统的概念1.命令的语法1.1命令介绍1.2选…

ChatGPT告诉你:项目管理能干到60岁吗?

早上好,我是老原。这段时间最火的莫过于ChatGPT,从文章创作到论文写作,甚至编程序,简直厉害的不要不要的。本以为过几天热度就自然消退了,结果是愈演愈烈,热度未减……大家也从一开始得玩乐心态&#xff0c…

python flask项目打包成docker镜像发布

1.编写python flask代码,简单写一个加法的接口,命名为sum.py import json from flask import Flask,request,render_template app Flask(__name__)app.route(/) def index():return hello worldapp.route(/sum,methods[POST]) def correct():a request…

C/C++网络编程笔记Socket

https://www.bilibili.com/video/BV11Z4y157RY/?vd_sourced0030c72c95e04a14c5614c1c0e6159b上面链接是B站的博主教程,源代码来自上面视频,侵删,这里只是做笔记,以供复习和分享。上一篇博客我记录了配置环境并且跑通了&#xff0…

Nginx——Nginx的优化设计

摘要 本博文介绍Nginx的优化设计方向和原理,帮助大家在nginx的使用和优化中提供一个参考的方向,让你的nginx发挥最大性能,节约系统资源。 一、Nginx开启Http2.0的优化 HTTP/2是HTTP协议的最新标准,它是HTTP/1.1的继承者。由于它…

大厂与小厂招人的区别,看完多少有点不敢相信

前两天在头条发了一条招人的感慨,关于大厂招人和小公司招人的区别。 大厂:有影响力,有钱,能够吸引了大量的应聘者。因此,也就有了筛选的资格,比如必须985名校毕业,必须35岁以下,不能…

数据结构与算法这么难,为什么我们还要学习?

文章目录前言1. 数据结构与算法是什么?2. 为什么数据结构与算法很难?3. 如何系统学习数据结构与算法?🍑 复杂度🍑 线性表🍑 树形结构🍑 图🍑 排序🍑 字符串🍑…

【c++】:模拟实现STL模板中的string

文章目录 前言一.string的模拟实现总结前言 上一篇文章我们详细介绍了STL中的string的一些常用的接口,这一篇文章我们将从底层实现string类,当然我们只是实现一些重要的,经常使用的接口,并且不是完全按照STL中的string去走的。 一…

对于从事芯片行业的人来说,有哪些知识是需要储备的?

近两年芯片行业大火,不少同学想要转行,却不知道该如何下手,需要学习哪些基础知识,下面就来看看资深工程师怎么说? 随着工艺的发展,芯片肯定是尺寸越来越小,至于小到什么样的程度是极限&#xf…

【小破站下载工具】Python tkinter 实现网站下载工具,所有数据一键获取

目录前言开发环境本次项目案例步骤先展示下完成品的效果界面导入模块先创建个窗口功能按键主要功能代码编写功能一功能二功能三前言 最近很多同学想问我,怎么把几个代码的功能集合到一起? 很简单,写一个界面就行了,想要哪个代码…

CSS的三大特性

🌟所属专栏:前端只因变凤凰之路🐔作者简介:rchjr——五带信管菜只因一枚😮前言:该系列将持续更新前端的相关学习笔记,欢迎和我一样的小白订阅,一起学习共同进步~👉文章简…

用ChatGPT生成Excel公式,太方便了

ChatGPT 自去年 11 月 30 日 OpenAI 重磅推出以来,这款 AI 聊天机器人迅速成为 AI 界的「当红炸子鸡」。一经发布,不少网友更是痴迷到通宵熬夜和它对话聊天,就为了探究 ChatGPT 的应用天花板在哪里,经过试探不少人发现&#xff0c…

vue3+vite项目移动端适配:postcss-pxtorem和amfe-flexible

一,定义 postcss-pxtorem PostCSS 的一个插件,可以从像素单位生成 rem 单位。 amfe-flexible amfe-flexible是配置可伸缩布局方案,主要是将1rem设为viewWidth/10。 二,使用 1. 设置 viewport 在 index.html 中: &l…

学生信息表

目录 一、功能说明 二、核心思想 三、所用知识回顾 四、基本框架 五、js功能实现部分 一、功能说明 (1)输入对应的信息,点击录入可以为下面的表格添加一条记录,注意当所填信息不完整时不允许进行提交。 (2&…

UE实现建筑生长(材质遮罩方式)效果

文章目录 1.实现目标2.实现过程2.1 遮罩2.2 生长动画3.参考资料1.实现目标 在UE中实现建筑的生成动画效果,GIF动图如下: 2.实现过程 通过动态设置材质遮罩OpacityMask的参数,即通过材质方式来实现建筑生长效果 2.1 遮罩 现有的教程中大多通过BoxMask-3D材质节点实现,但是…

扫地机器人(蓝桥杯C/C++)

题目描述 小明公司的办公区有一条长长的走廊,由 NN 个方格区域组成,如下图所示。 走廊内部署了 KK 台扫地机器人,其中第 ii 台在第 A_iAi​ 个方格区域中。已知扫地机器人每分钟可以移动到左右相邻的方格中,并将该区域清扫干净。…

Linux信号

目录 信号入门 1. 生活角度的信号 2. 技术应用角度的信号 3. 注意 4. 信号概念 5. 用kill -l命令可以察看系统定义的信号列表 6. 信号处理常见方式概览 产生信号 1. 通过终端按键产生信号 2. 调用系统函数向进程发信号 3. 由软件条件产生信号 4. 硬件异常产生信号 核…

DHCP原理简析及交互实践

环境: os:centos7 dnsmasq:version 2.76 一. dhcp工作原理 首先补充几个dhcp相关的基本概念: 1、动态主机配置协议DHCP(Dynamic Host Configuration Protocol)是一种网络管理协议,用于集中对用…

程序员必会技能—— 使用日志

目录 1、为什么要使用日志 2、自定义日志打印 2.1、在程序中得到日志对象 2.2、使用日志对象打印日志 2.3、日志格式 3、日志的级别 3.1、日志级别的分类 3.2、日志级别的设置 4、持久化日志 5、更简单的日志输出——lombok 5.1、如何在已经创建好的SpringBoot项目中添加…

Python+ChatGPT实战之进行游戏运营数据分析

文章目录一、数据二、目标三、解决方案1. DAU2. 用户等级分布3. 付费率4. 收入情况5. 付费用户的ARPU最近ChatGPT蛮火的,今天试着让ta写了一篇数据分析实战案例,大家来评价一下!一、数据 您的团队已经为您提供了一些游戏数据,包括…