Spring IoC容器、IoC与DI

news2024/12/22 18:12:33

目录

Spring是什么?

理解容器 

什么是IoC(Inversion of Control)

传统的new创建对象的方式中类与类的耦合程度很大。 

IoC的优势: 

Spring IoC容器最核心的功能 

什么是DI (Dependency Injection)

IoC和DI的区别 


Spring是什么?

Spring是指Spring Framework(Spring框架),它是开源的框架,有着很庞大的社区,通过使用Spring可以使我们的开发变的更简单。一句话概括的话:Spring是包含众多工具方法的IoC容器。

理解容器 

容器就是用来容纳某种物品的基本装置。

像我们之前学过的List,Map等等都是用来容纳元素的容器,像Tomcat就是用来存放Web应用程序的容器。

什么是IoC(Inversion of Control)

翻译过来就是控制权反转 

在谈到IoC的时候,我们总是会和传统的new创建对象的方式进行比较。 

我们知道:

传统的new创建对象的方式中类与类的耦合程度很大。 

例如:我们要创建一个汽车模型,按照传统的方式我们是这样实现的:

正常流程我们会在每一层下面去new下一层的对象

public class Car {
    public static void main(String[] args) {
        Car car=new Car();
        car.Init();

    }
    //框架
    static class Frame{
        //车架初始化
        public void FrameInit(){
            //在车架中new 车轮
            Tire tire=new Tire();
            //调用初始化方法
            tire.TireInit();
            System.out.println("车架已完成初始化");

        }

    }
    //车轮
    static class Tire{
        //车轮初始化
        public void TireInit(){
            System.out.println("车轮已完成初始化");
        }
    }
    //Car初始化
    private void Init(){
        //new 下一层对象
        Frame frame=new Frame();
        //调用下一层对象的初始化方法
        frame.FrameInit();//这一层方法中会new下一层的对象并调用初始化方法
        System.out.println("车辆已完成初始化>>  车辆制作完成!");
    }
}

这个时候如果我们有了新的需求就会牵一发而动全身。耦合性太高了。比如我们要实现轮胎的尺寸定制。就需要每个类中都进行修改:

public class Car {
    public static void main(String[] args) {
        Car car=new Car();
        car.Init(50);

    }
    //框架
    static class Frame{
        //车架初始化
        public void FrameInit(int size){
            //在车架中new 车轮
            Tire tire=new Tire();
            //调用初始化方法
            tire.TireInit(size);
            System.out.println("车架已完成初始化");

        }

    }
    //车轮
    static class Tire{
        //车轮初始化
        public void TireInit(int size){
            System.out.println("车轮已完成初始化");
            System.out.println("轮胎的尺寸为:"+ size);
        }
    }
    //Car初始化
    private void Init(int size){
        //new 下一层对象
        Frame frame=new Frame();
        //调用下一层对象的初始化方法
        frame.FrameInit(size);//这一层方法中会new下一层的对象并调用初始化方法
        System.out.println("车辆已完成初始化>>  车辆制作完成!");
    }
}

 所以我们可以直接在每一层提供属性引用,直接指向下一层:

public class Car {
    //车架
    private Frame frame;
    //在构造方法中获得该车架
    public Car(Frame frame){
        this.frame=frame;
    }

    //在车的初始化方法中执行车架的初始化方法
    public void init(){
        frame.init();
    }

    //车架类
    static class Frame{
        //轮胎
        private Tire tire;
        //构造方法中获得该轮胎
        public Frame(Tire tire){
            this.tire=tire;
        }
        //在车架的初始化方法中调用轮胎的初始化方法
        public void init(){
            tire.init();
        }
    }

    //轮胎类
    static class Tire{
        //设置轮胎的属性
        private int size;
        //轮胎的尺寸
        public Tire(int size){
            this.size=size;
        }
        //轮胎的初始化方法
        public void init() {
            System.out.println("轮胎的大小是:"+this.size);
        }
    }

    public static void main(String[] args) {
        //创建轮胎类,制定轮胎大小
        Tire tire=new Tire(20);
        //创建车架类,轮胎作为属性传递进去
        Frame frame=new Frame(tire);
        //创建一个Car类,frame作为属性传递下去
        Car car=new Car(frame);
    }
}

这时候,如果我们还需要修改Tire,只需要改动两个地方:一个是Tire类属性,一个是main方法中的参数,然后中间的调用过程就不用修改了,这时候耦合性就降低下来了。 

这个时候我们再说说IoC:

IoC的优势: 

实现代码解耦,同时把对象(Bean)交给了IoC进行维护,与传统的方式相比,IoC不再是上级对象创建控制下一层对象了,而是把下一层的对象注入到上一级对象当中,所以IoC就是把控制对象生命周期的权利交给了IoC容器。

传统方式与IoC方式的对比:

Spring IoC容器最核心的功能 

管理对象(Bean)在Spring中的存取。 

什么是DI (Dependency Injection)

翻译过来就是依赖注入 ,指的就是把对象(Bean)注入到IoC容器当中,如果外面想要获取该对象,就需要从容器中取

IoC和DI的区别 

IoC是一种重要的思想,是Spring的核心思想之一。这种思想就是控制权反转,把对象(Bean)的生命周期交给IoC容器,而DI则是IoC思想的具体实现 。比如我今天的心情比较好,我想出去玩。我想出去玩就是IoC,就是思想和目标,而我想出去玩我可以去动物园玩,也可以去游乐场玩,这就是DI,也就是具体的实现。

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

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

相关文章

145. 二叉树的后序遍历【34】

难度等级:容易 上一篇算法: 102. 二叉树的层序遍历【206】 力扣此题地址: 145. 二叉树的后序遍历 - 力扣(Leetcode) 1.题目:145. 二叉树的后序遍历 给你二叉树的根节点 root ,返回它节点值的 后…

Django DRF - JWT Token认证使用

JWT Token认证使用 jwt官网:https://jwt.io/ 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证。我们不再使用Session认证机制,而使用Json Web Token认证机制。 一. JWT概念 Json web token (JWT),…

JavaScript—javaEE

文章目录 1.关于JavaScript2.引入的方式3.输入输出4.语法4.1变量4.2基本数据类型4.3运算符4.4数组4.5函数4.6对象 5.dom5.1获取元素5.2操作元素5.3表单控件5.4样式:style属性5.5模仿和服务端交互 6.ajax6.1概念6.2作用6.3Ajax代码6.4Ajax发get请求6.5Ajax发post请求…

【文件系统和系统日志分析】

目录 一、inode和block概述block(块)inode(索引节点) 二、inode内容三、inode的号码3.1、查看inode号码的方法 四、inode的大小磁盘分区后的结构访问文件的简单流程 五、删除乱码文件六、inode节点耗尽故障处理6.1、模拟inode节点…

【Tomcat】Tomcat的安装配置和在Idea中使用Tomcat:

文章目录 一、获取安装包二、配置环境三、验证是否配置成功【法一】通过运行tomcat文件夹下的bin文件夹中的 startup.bat【法二】快捷键【winr】,输入【cmd】,点击【确定】,输入 startup.bat 四、出现乱码和端口号被占用的解决方案【1】出现乱…

Spring概述,IOC,AOP使用

Spring简介 Spring概述 官网地址:https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Java 平台,它最…

OpenStack 面板更替换代:Skyline Dashboard <-- Horizon 面板

~、OpenStack 面板更替换代&#xff1a;Skyline Dashboard <-- Horizon 面板 先决条件 一个至少运行核心组件的 OpenStack 环境, 并能通过 Keystone endpoint 访问 OpenStack 组件 一个安装有容器引擎的 (docker 或 podman) 的 Linux 服务器 一、 &#xff08;一&…

用starter实现api接口的加密与日志功能

一、概述 运用AOP技术实现对api接口的加密及日志功能。 加密&#xff1a; 需要加密的api接口上加注解&#xff1a;Encrypt&#xff08;自定义注解&#xff09;接口返回类型为String时才加密采用对称加密&#xff1a;加密和解密使用相同的密钥 日志&#xff1a; 对所有的api接…

【虚拟仿真】Unity3D打包WEBGL后播放视频(VideoPlayer组件)

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 本篇文章实现Unity3D打包WEBGL后播放视频&#xff0c;如下图所…

实现服务器版本的表白墙

目录 初始前端代码 网页初始效果 一、确定接口 二、编写代码 2.1 创建项目七步走 1、创建Maven项目 2、引入依赖 3、构建目录 4、编写代码 5、打包、部署 ​编辑 7、验证代码 三、具体的代码逻辑 3.1 服务器——两个服务接口 3.2 前端页面的代码 3.2.1 前端存档…

Springcloud快速复习

按照个人的习性,分布式我学习完以后一定会忘为此写次笔记自己快速复习 目录 Springcloud介绍注册中心 Springcloud介绍及微服务介绍 为什么学? 也不是以前的单体架构被淘汰而是,当业务足够大型,进行优化 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff…

SystemUI流程

目录 SystemUI类图 SystemUI流程一&#xff1a;SystemUI启动流程 SystemUI流程二&#xff1a;StatusBar创建流程 SystemUI流程三&#xff1a;系统Notification实现流程 源码基于 Android 12。 SystemUI 是 Android 的系统界面&#xff0c;在 Andorid 系统源码中&#xff0c;…

MySQL安装文档

一、下载 点开下面的链接&#xff1a;https://dev.mysql.com/downloads/mysql/ 点击Download 就可以下载对应的安装包了, 安装包如下: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0gE9C3W-1682005377951)(assets/image-20221020012428839.png)]…

5. VBA消息框(MsgBox)

MsgBox函数显示一个消息框&#xff0c;并等待用户点击一个按钮&#xff0c;然后根据用户点击的按钮执行相关的操作。 5.1 语法 MsgBox(prompt[,buttons][,title][,helpfile,context]) 5.2 参数说明 prompt - 必需的参数。在对话框中显示为消息的字符串。提示的最大长度大约为…

腾讯云4核8G服务器CVM S5和轻量应用服务器性能PK来了

腾讯云4核8G云服务器可以选择轻量应用服务器或CVM云服务器标准型S5实例&#xff0c;轻量4核8G12M服务器446元一年&#xff0c;CVM S5云服务器935元一年&#xff0c;相对于云服务器CVM&#xff0c;轻量应用服务器性价比更高&#xff0c;轻量服务器CPU和CVM有区别吗&#xff1f;性…

ERROR [io.undertow.request] UT005023: Exception handling request 报错处理

1.背景 找了好久&#xff0c;突然灵光乍现是不是因为容器错误问题&#xff0c;本来就是刚从github上下载下来的项目&#xff0c;怎么别人不报错就我报错嘞&#xff0c;我还什么都没改怎么能这样&#xff01;&#xff01;&#xff01;&#xff01; 这就是我的报错&#xff0c;乍…

storm proxies代理服务器IP如何提高安全性?

代理服务器IP可以通过以下方式来提高安全性&#xff1a; 选择可靠的代理提供商&#xff1a;选择经过信誉验证、有良好用户评价的代理提供商&#xff0c;确保代理服务器IP的稳定性和可靠性&#xff0c;减少被黑客攻击的风险。使用加密通信协议&#xff1a;使用支持加密通信协议&…

【网络编程】网络套接字,UDP,TCP套接字编程

前言 小亭子正在努力的学习编程&#xff0c;接下来将开启javaEE的学习~~ 分享的文章都是学习的笔记和感悟&#xff0c;如有不妥之处希望大佬们批评指正~~ 同时如果本文对你有帮助的话&#xff0c;烦请点赞关注支持一波, 感激不尽~~ 特别说明&#xff1a;本文分享的代码运行结果…

RSA大数N分解Pollard_rho和素数测试Tkinter GUI

RSA大数N分解Pollard_rho和素数测试 系统介绍 : 环境要求&#xff1a; 1、python 2、Tkinter GUI 3、rsa RSA大数N分解和素数测试是密码学中非常重要的问题。其中&#xff0c;RSA算法是基于大质数分解的困难性而设计的公钥加密算法&#xff0c;而素数测试则是判断一个数是…

【0190】Unix 域套接字实战(2)

文章目录 1. UNIX套接字通信2. 为什么需要套接字3. 套接字生命周期4. 示例代码1. UNIX套接字通信 套接字提供进程之间的一种通信方式,即它们交换数据的一种方式。它通常的工作方式是process_a has socket_x, process_b has socket_y, 和两个套接字相连。然后每个进程都可以使…