IoC与Spring

news2024/11/29 20:54:40

目录

IoC控制反转

现实案例

特点

目的

DI依赖注入

小总结

介绍Spring

狭义和广义上的Spring

传统编码方式的不足

需求引入

弊端分析

IoC控制反转

现实案例

1、买水果问老板各种水果的口感而不是自己去挨个尝试一遍。

2、买房子找中介而不是自己去花时间找房东。

IoC控制反转的核心理念是:不是最终的消费者去负责创建对象,而是引入一个中间人角色,由这个中间人统一负责对象的创建过程。

特点

1、是一种设计理念,是程序设计遵循的标准

2、代理人创建管理对象,消费者通过代理人获取对象。

3、降低对象之间的直接耦合,将消费者和对象解耦。

目的

加入IoC容器将对象统一管理,让对象关联变为弱耦合。

在这里果商就相当于IoC容器。

DI依赖注入

1、是具体技术实现。

2、在Java中底层通过反射技术实现对象注入。

下文有进一步关于DI的解释。

小总结

1、反转:从对象的使用方去创建对象变成了由IoC容器去创建对象。

2、IoC的好处:

           1)没有代理人之前,使用方需要了解所有对象的内容后,才能知道我们需要的是哪个对象,这种情况下使用方和对象是硬性关联,程序难以维护和扩展。

           2)引入代理人之后,使用方不用去了解所有的对象,直接和IoC容器打交道就行了。使用方和对象之间,通过IoC容器这个代理人,实现了解耦,对象之间更加灵活,方便扩展和维护。

介绍Spring

狭义和广义上的Spring

(1)狭义的Spring框架:通过一种高度的封装和抽象的Java技术,来简化程序的开发,Spring框架提供了IoC容器,来管理系统中的对象及其依赖。

(2)广义的Spring:最原始的Spring是只有一个IoC容器的Spring Framework,对对象集中管理,在此基础上,Spring不断发展,派生了大量的工程和完善的生态体系,由此形成了广义上的Spring。

1、这个IoC容器是一个抽象的,其就相当于在Java的运行内存中,开辟了一块空间,这个空间是由Spring管理的。

2、所有的对象,不是由使用者或者A对象来创建的,都是由Spring IoC容器统一负责创建。

3、当IoC容器,把对象都创建好了之后,由于A对象是依赖于B对象实现全部功能的,但我们不在A对象中去new一个B对象,而是基于反射技术,将A对象的依赖(即B对象)注入到A对象中,这就是所谓的依赖注入(DI)

传统编码方式的不足

需求引入

由一个变成需求引入为何需要Spring:

通过创建maven项目写下以下三个类:

package com.spring.ioc.entity;

public class Apple {
    private String title;
    private String color;
    private String origin;
    //生成默认的构造方法
    public Apple() {
    }
    //方便对象实例化
    public Apple(String title, String color, String origin) {
        this.title = title;
        this.color = color;
        this.origin = origin;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getColor() {
        return color;
    }

    public void setColor(String color) {
        this.color = color;
    }

    public String getOrigin() {
        return origin;
    }

    public void setOrigin(String origin) {
        this.origin = origin;
    }
}
package com.spring.ioc.entity;

public class Child {
    private String name;
    private Apple apple;
    public Child(){

    }
    public Child(String name, Apple apple) {
        this.name = name;
        this.apple = apple;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Apple getApple() {
        return apple;
    }

    public void setApple(Apple apple) {
        this.apple = apple;
    }
    public void eat(){
        System.out.println(name + "吃到了" + apple.getOrigin() + "种植的" + apple.getTitle());
    }
}
import com.spring.ioc.entity.Apple;
import com.spring.ioc.entity.Child;

public class Application {
    public static void main(String[]args){
        Apple apple1 = new Apple("红富士", "红色", "欧洲");
        Apple apple2 = new Apple("青苹果", "绿色", "中亚");
        Apple apple3 = new Apple("金帅", "黄色", "中国");
        Child lily = new Child("莉莉", apple1);
        Child andy = new Child("安迪", apple2);
        Child luna = new Child("卢娜", apple3);
        lily.eat();
        andy.eat();
        luna.eat();
      }

}

运行结果展示:

弊端分析

1、字符串等文本信息是写死的。 

2、对象是写死的,在编译时就已经确定了。

3、对象之间是硬关联。

传统编码方式很不利于程序的可维护性和扩展性,因为苹果根据季节不同信息会发生变化,孩子的口味和想吃的苹果会发生变化,或者我们想引入一个新的对象都需要对源码进行修改和审批,费时费力,此时Spring应运而生。

Spring最根本的目的就是通过配置的方式,完成对象的实例化,和对象与对象之间的依赖关系,目的都是为了提高程序的可维护性和可扩展性。

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

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

相关文章

字节对编码 (BPE):提升语言处理的效率和有效性

原文地址:byte-pair-encoding-bpe-bridging-efficiency-and-effectiveness-in-language-processing 2024 年 4 月 12 日 介绍 在快速发展的自然语言处理 (NLP) 领域,对人类语言高效解析和理解的追求带来了重大创新。字节对编码(BPE&#x…

Windows 任务计划程序 【不管用户是否登录都要运行】执行时不显示CMD或程序窗口

任务计划程序右侧可以导出xml 「只在用户登录时运行」LogonType:InteractiveToken。 「不管用户是否登录都要运行」LogonType:Password。 用管理员运行CMD :schtasks /change /it /tn "test" 「不管用户是否登录都要运行」Logon…

邮件过滤是什么?怎么设置邮件过滤?

现在我们每天都要收发很多电子邮件。有的是朋友发来的问候,有的是工作伙伴的沟通,还有的可能是那些我们不想要的广告或垃圾邮件。这么多邮件,怎么看过来呀?其实,有一个好工具叫“邮件过滤”,它就像你的私人…

Python --- 怎么把Python当计算器用?(小白自学笔记)

怎么把Python当计算器用?(小白自学笔记) Part I:标准数学包的导入 今天刚刚装了python,打算用它来取代matlab的基本计算功能,当我的日常计算器用。(这里还有一个捷径,如果你跟我一样也是纯小白的话,直接问c…

市场复盘总结 20240417

仅用于记录当天的市场情况,用于统计交易策略的适用情况,以便程序回测 短线核心:不参与任何级别的调整,采用龙空龙模式 一支股票 10%的时候可以操作, 90%的时间适合空仓等待 二进三: 进级率 100% 最常用的二…

鸿蒙相关岗位需求突增!你具体知道都有哪些岗位吗?

1 月 18 日,鸿蒙 Next 预览版面向开发者正式开放申请。至此,鸿蒙原生应用版图已成型,这个中国自主研发的操作系统,正式走上了独立之路。 随后迎来了不少互联网公司与华为鸿蒙原生应用达成了合作,像我们常见的阿里、京…

[ ROS入门]

00ROS实现流程大致分为5步 先创建一个工作空间;再创建一个功能包;编辑源文件;编辑配置文件;编译并执行。 01创建工作空间 02进入src创建ros包并添加依赖 上述命令,会在工作空间下生成一个功能包,该功能包依…

OpenHarmony实战开发-如何使用Navigation实现多设备适配。

介绍 在应用开发时,一个应用需要适配多终端的设备,使用Navigation的mode属性来实现一套代码,多终端适配。 效果图预览 使用说明 将程序运行在折叠屏手机或者平板上观看适配效果。 实现思路 本例涉及的关键特性和实现方案如下&#xff1a…

TR-DPO:革新大模型对齐技术

这篇论文中提出的TR-DPO(Trust Region Direct Preference Optimization)方法的架构或流程设计主要侧重于改进语言模型对齐过程中的稳定性和有效性。 在传统的对齐方法中,模型在学习的时候需要尽可能地靠近一个预先设定的参考模型。这就像是给…

https加密证书

网站要出去安全模式访问,加强网络安全就需要使用HTTPS加密证书。 本文主要介绍什么是HTTPS加密证书,如何申请HTTPS加密证书,如何安装HTTPS加密证书等问题展开讨论。 什么是HTTPS加密证书? HTTPS加密证书的行业产品用语叫作SSL证…

将gidp模块、ipam集成到ultralytics项目中实现gidp-yolov8、ipam-yolov8

gdip-yolo与ia-seg都是一种将图像自适应模块插入模型前面,从而提升模型在特定数据下检测能力的网络结构。gdip-yolo提出了gdip模块,可以应用到大雾数据与低亮度数据(夜晚环境),然后用于目标检测训练;ia-seg将ia-yolo中的代码修改了一下修车了ipam模块,应用到低亮度数据(…

监控系统Prometheus--与第三方框架集成

文章目录 Prometheus和Flink集成拷贝jar包修改Flink配置为了运行测试程序,启动netcat启动hdfs、yarn,提交flink任务到yarn上可以通过8088跳到flinkUI的job页面,查看指标统计刷新Prometheus页面,如果有flink指标,集成成…

ORAN C平面 Section Extension 23

ORAN C平面Section扩展23用于任意symbol模式的调制压缩参数。此section扩展允许为一个或多个“SymPrbPatterns”指定多组“mcScaleReMask、csf和mcScaleOffset”值。“SymPrbPattern”用于指定一组PRB,这些PRB可以跨越使用prbPattern指定的整个PRB范围(频…

基于SpringBoot+Vue的医院挂号就诊系统设计与实现(源码+文档+包运行)

一.系统概述 传统办法管理信息首先需要花费的时间比较多,其次数据出错率比较高,而且对错误的数据进行更改也比较困难,最后,检索数据费事费力。因此,在计算机上安装医院挂号就诊系统软件来发挥其高效地信息处理的作用&a…

【C++】STL之string的模拟实现

在本篇博客中,作者将会带领你模拟实现简单的STL中的string类的。至于string的常规使用,这里不做讲解。 string类的c参考文档 string - C Reference (cplusplus.com) 一.string的基本结构 string类的大致结构可以分为三个变量来表示,一个是字…

UE5 HLSL 详细学习笔记

这里的POSITION是变量Position的语义,告诉寄存器,此变量的保存位置,通常语义用于着色器的输入和输出,以冒号“:”的方式进一步说明此变量,COLOR也类似 还有什么语义呢? HLSL核心函数&#xff1a…

js如何将对象转换成数组

方法一:Object.values(obj) 示例: var obj { name: 小明, age: 22 }; console.log( Object.values(obj) ); // [小明, 22] 方法二:for-in循环 示例: var obj { name: 小明, age: 22 }; var arr []; let objName []; for(l…

Spingbot项目配置mySQL或postgresSQL详解

1:postgresql库: yml文件 探索PostgreSQL:从基础到实践(简单实例) # PageHelper分页插件 pagehelper:helperDialect: postgresqlreasonable: truesupportMethodsArguments: trueparams: countcountSql# 数据源配置 spring:datas…

ArcGIS无法链接在线地图或错误: 代理服务器从远程服务器收到了错误地址(验证服务器是否正在运行)。

这几天我们分享了! 谷歌卫星影像图归来!ArcGIS直连!快来获取_谷歌影像lyr-CSDN博客文章浏览阅读666次,点赞11次,收藏9次。大概。_谷歌影像lyrhttps://blog.csdn.net/kinghxj/article/details/137521877一套图源搞定&a…

LPA算法简介

1. 背景 标签传播算法(Label Propagation Algorithm)是一种基于图的半监督学习方法,其基本思路是用已标记节点的标签信息去预测未标记节点的标签信息。 2. 算法流程 1. 为每个节点随机的指定一个自己特有的标签; 2. 逐轮刷新所有节点的标签&#xff0…