IoC与Spring

目录

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.hqwc.cn/news/626595.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

springcloud 整合swagger文档教程

我用的是nacos和gateway 我的模块 父依赖没什么太大关系如果出现版本冲突问题可用参考我的依赖版本 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org…

claude国内无法使用的解决办法

claude3国内如何使用, claude国内无法使用的解决办法来啦&#xff01; 近日&#xff0c;人工智能公司AnthropicAI推出了全新的大语言模型Claude 3系列&#xff0c;其中最强大的版本Claude 3 Opus据称在性能上全面超越了OpenAI的GPT-4模型。Claude 3系列包括三个版本&#xff1…

金融科技领航者 财源滚滚选股软件助力投资者智赢未来

在波澜壮阔的金融科技浪潮中&#xff0c;河北源达凭借深厚的行业积淀与前瞻的创新思维&#xff0c;逐渐崭露头角&#xff0c;成为业界瞩目的领航者。多年来&#xff0c;公司始终坚守初心&#xff0c;致力于为客户提供高效、的金融科技服务&#xff0c;助力投资者在资本市场中稳…

OpenCV与AI深度学习 | 实战 | 基于YOLOv9+SAM实现动态目标检测和分割(步骤 + 代码)

本文来源公众号“OpenCV与AI深度学习”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;实战 | 基于YOLOv9SAM实现动态目标检测和分割&#xff08;步骤 代码&#xff09; 0 导 读 本文主要介绍基于YOLOv9SAM实现动态目标检测和分…

每日两题 / 76. 最小覆盖子串 239. 滑动窗口最大值(LeetCode热题100)

76. 最小覆盖子串 - 力扣&#xff08;LeetCode&#xff09; 类似双指针&#xff08;滑动窗口&#xff09;&#xff0c;一开始l和r指向0下标&#xff0c;当区间[l, r)之间的字符串无法覆盖t串时&#xff0c;r。直到区间覆盖了t串 接着移动l指针&#xff0c;假设当前区间为[l …

毕设学习:联邦学习梯度聚合加密算法

原本的加密算法大致思路&#xff1a;各个客户端上传梯度时进行加密&#xff0c;服务端直接用有扰乱的梯度当成真梯度来计算&#xff0c;这样一来谁也不知道谁是真梯度 为了避免原本的算法的一些问题&#xff0c;本文提出了加密-解密结构&#xff0c;并证明了这种结构带来的误差…

光伏电站智能勘探:无人机优势及流程详解

随着科技和互联网技术的不断发展&#xff0c;无人机在各个领域的应用越来越广泛&#xff0c;其中之一就是光伏电站智能勘探。利用无人机高清摄像头和传感器等设备&#xff0c;可以对光伏电站周边环境、日照情况、房屋状态进行全方面的勘探和记录&#xff0c;搭配卫星勘探、实地…

掌上医院预约挂号系统源码,开发技术:C#+uni-app+.net+SqlServer

医院微信预约挂号系统是一种基于微信平台的医疗服务系统&#xff0c;它利用微信的广泛覆盖和便捷性&#xff0c;为患者提供线上预约挂号的服务。通过该系统&#xff0c;患者可以使用自己的微信账号登录&#xff0c;浏览医院的医生排班信息&#xff0c;选择合适的医生和就诊时间…

【Python】异常处理结构

文章目录 1.python异常2.try_except异常处理结构3.try... 多个except异常处理4.try_except_else异常处理结构5.try_except_finally异常处理结构6.常见报错类型 在运行代码时&#xff0c;总是遇到各种异常&#xff0c;且出现异常时&#xff0c;脚本就会自动的的停止运行&#xf…

野生动物保护视频AI智能监管方案,撑起智能保护伞,守护野生动物

一、背景 在当今世界&#xff0c;野生动物保护已经成为全球性的重要议题。然而&#xff0c;由于野生动物生存环境的不断恶化以及非法狩猎等活动的盛行&#xff0c;保护野生动物变得尤为迫切。为了更有效地保护野生动物&#xff0c;利用视频智能监管技术成为一种可行的方案。 …

2024年在Vim中开发vue2+java

neovim 0.5刚出来的时代&#xff0c;那时刚有lua插件我很狂热。每天沉迷于打造自己的IDE之中。写过一堆相关的博客&#xff0c;也录过一些视频教程。后来发现neovim的接口和插件更新的很快&#xff0c;导致配置文件要不定期的修改&#xff0c;才能保证新版本的插件的适配。我也…

案例实践 | InterMat:基于长安链的材料数据发现与共享系统

案例名称&#xff1a;InterMat-基于区块链的材料数据发现与共享系统 ■ 建设单位 北京钢研新材科技有限公司 ■ 用户群体 材料数据上下游单位 ■ 应用成效 已建设10共识节点、50轻节点&#xff0c;1万注册用户 案例背景 材料是构成各种装备和工程的物质载体&#xff0c…