【Java进阶营】Spring IOC的产生背景

【修真院java小课堂】Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例? 大家好,我是IT修真院西安分院第三期学员,一枚正直纯洁善良的JAVA程序员。今天给大家分享一下,修真院官网JAVA任务一,深度思考中的知识点——Spring中的IOC是什么意思,为什么要用IOC而不是New来创建实例?一、背景介绍      Spring是一个开源的轻量级Java SE(Java 标准版本)/Java EE(Java 企业版本)开发应用框架,其目的是用于简化企业级应用程序开发。应用... 阅读详情

在实际项目设计过程中,接口是一个重要组成元素,不同层之间的操作需要通过接口来调用。利用接口,可以实现子类的隐藏,也可以更好地描述不同层之间的操作标准。Java 中要想获得接口对象,需要通过关键字 new 来实现。

【示例 1】通过关键字new实例化接口对象

1.  package demo;
2.  interface  IMessage {    // 定义业务接口
3.  /**
4.  * 信息回显处理
5.  * @param msg 原始信息
6.  * @return 追加回显后的信息
7.  */
8.  public String  echo(String  msg);   
9.  }
10.  class  MessageImpl implements IMessage {    // 定义接口子类
11.  @Override
12.  public String  echo(String  msg) {
13.  return "【ECHO】" + msg;    // 回显处理
14.  }
15.  }
16.  public class  TestMessageDemo {
17.  public static void main(String[] args) {
18.  IMessage  message = new MessageImpl();    // 通过关键字new直接实例化
19.  System.out.println(message.echo("https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzg3MzczNjYzMA==&scene=124&uin=&key=&devicetype=Windows+10+x64&version=6302019c&lang=zh_CN&a8scene=7&fontgear=2"));
20.  }
21.  }

程序执行后,结果如下:

【ECHO】https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzg3MzczNjYzMA==&scene=124&uin=&key=&devicetype=Windows+10+x64&version=6302019c&lang=zh_CN&a8scene=7&fontgear=2

本程序是一个典型的 Java 原生代码处理操作。new 是 Java 进行对象实例化最基础的关键字,但使用 new 会暴露 IMessage 接口子类,同时会让子类与接口之间产生耦合,如图 1 所示。

image.png

图 1  通过关键字 new 实例化接口对象

很明显,不同层之间出现接口子类暴露是一种不合理的设计模式,因为调用者并不需要知道具体子类是哪个,只需要取得接口对象即可。采用工厂设计模式,就可以起到解耦合的目的。在此我向大家推荐一个架构学习交流圈。交流学习伪鑫:1253431195(里面有大量的面试题及答案)里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构等这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

【示例 2】通过工厂设计模式获取接口对象

1.  package demo;
2.  interface  IMessage {    // 定义业务接口
3.  /**
4.  * 信息回显处理
5.  * @param msg 原始信息
6.  * @return 追加回显后的信息
7.  */
8.  public String  echo(String  msg);  
9.  }
10.  class  Factory {
11.  private Factory() {}    // 构造方法私有化
12.  public static IMessage  getInstance(String  className) {
13.  if ("echo".equals(className)) {
14.  return new MessageImpl() ;    // 返回接口实例
15.  }
16.  return null ;
17.  }
18.  }
19.  class  MessageImpl implements IMessage {    // 定义接口子类
20.  @Override
21.  public String  echo(String  msg) {
22.  return "【ECHO】" + msg;    // 回显处理
23.  }
24.  }
25.  public class  TestMessageDemo {
26.  public static void main(String[] args) {
27.  IMessage  message = Factory.getInstance("echo") ;    // 通过工厂类获取接口对象
28.  System.out.println(message.echo("https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzg3MzczNjYzMA==&scene=124&uin=&key=&devicetype=Windows+10+x64&version=6302019c&lang=zh_CN&a8scene=7&fontgear=2"));
29.  }
30.  }

程序运行后,结果如下:

【ECHO】https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzg3MzczNjYzMA==&scene=124&uin=&key=&devicetype=Windows+10+x64&version=6302019c&lang=zh_CN&a8scene=7&fontgear=2

本程序采用工厂设计模式解决了调用者与具体子类之间的耦合关联。调用者只需通过 Factory 类,就可以获取接口对象,不用再关注具体的子类是哪一个。本程序的代码结构如图 2 所示。

image.png

图 2 通过工厂类获取接口对象

虽然通过工厂设计模式可以改善接口对象的获取处理,但如果一个接口有无数个子类,且这些子类可随时动态增加,这样的静态工厂设计就会产生问题,会导致大量的修改操作。实际开发中,还需要结合反射机制来改善工厂设计。

【示例 3】利用反射机制改善工厂设计

1.  package demo;
2.  interface  IMessage {    // 定义业务接口
3.  /**
4.  * 信息回显处理
5.  * @param msg 原始信息
6.  * @return 追加回显后的信息
7.  */
8.  public String  echo(String  msg);   
9.  }
10.  class  Factory {
11.  private Factory() {}    // 构造方法私有化
12.  @SuppressWarnings("unchecked")
13.  public static  T  getInstance(String  className) {    // 通过反射实例化
14.  try {
15.  return (T) Class.forName(className).getDeclaredConstructor().newInstance();
16.  } catch (Exception  e) {
17.  return null ;
18.  }
19.  }
20.  }
21.  class  MessageImpl implements IMessage {    // 定义接口子类
22.  @Override
23.  public String  echo(String  msg) {
24.  return "【ECHO】" + msg;    // 回显处理
25.  }
26.  }
27.  public class  TestMessageDemo {
28.  public static void main(String[] args) {
29.  IMessage  message = Factory.getInstance("demo.MessageImpl") ;    // 通过工厂类获取接口对象
30.  System.out.println(message.echo("https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzg3MzczNjYzMA==&scene=124&uin=&key=&devicetype=Windows+10+x64&version=6302019c&lang=zh_CN&a8scene=7&fontgear=2"));
31.  }
32.  }

程序运行后,结果如下:

【ECHO】https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=Mzg3MzczNjYzMA==&scene=124&uin=&key=&devicetype=Windows+10+x64&version=6302019c&lang=zh_CN&a8scene=7&fontgear=2

本程序通过反射机制修改了 Factory 工厂类的设计,在调用 Factory.getInstance( ) 方法时,必须明确传入子类对象的完整名称。这样设计的好处在于,工厂类不会再与某个具体的接口或子类耦合,因此更加具有通用性。本程序的代码结构如图 3 所示。

image.png

图 3  反射与工厂设计相结合

本例利用反射机制成功改良了工厂类的设计,使得程序结构更加清晰,同时避免了程序代码可能产生的耦合问题,但这样的配置依然存在着以下问题:

  1. 获取对象时需要传递完整的“包.类”名称。这样的客户端调用显然存在缺陷,最好的解决方案是追加一个配置文件,而后根据某个名称来获取对应的“包.类”名称信息,再通过反射进行加载。
  2. 配置文件不应该只简单描述“名称 = 包.类”关系,还应包含依赖关系配置。
  3. 应该更合理地实现多线程管理,避免过多的重复对象产生。

也就是说,要想实现一整套合理的对象管理容器,直接采用原生 Java 代码并不只靠一个简单的反射机制可以解决问题,还需要考虑各种对象的状态与对象管理。

Spring 的 IOC 技术可以帮助开发者减少这些设计上的思考,使其将更多精力放在核心代码的开发处理上。

揭秘 Java Spring 的 IoC 容器 Java Spring 的 IoC 容器是 Spring 框架的核心组件之一,其目的在于简化 Java 应用程序的开发,提高代码的可维护性和可测试性。通过 IoC 容器,开发者可以将对象的创建、依赖关系的管理等任务交给容器来处理,从而专注于业务逻辑的实现。本文的范围涵盖了 IoC 容器的基本概念、工作原理、核心算法、实际应用等方面,旨在帮助读者全面深入地理解和掌握 Java Spring 的 IoC 容器。本文将按照以下结构进行阐述:首先介绍 IoC 容器的核心概念与联系,让读者对其有一个初步的认识; 阅读详情

相关推荐

Java IoC容器对比:Spring vs Guice vs PicoContainer

想象一下你开了一家奶茶店:从前台点单到制作奶茶,需要杯子、茶叶、奶精、糖等“依赖”。如果每次做奶茶都要自己去仓库拿杯子、煮茶叶、调奶精(手动管理依赖),不仅效率低,还容易出错(比如拿错杯子尺寸)。这时候你需要一个“奶茶助手”——专门负责准备好所有材料,你只需要喊一声“我要做奶茶”,助手就把材料递过来(自动注入依赖)。这个“助手”就是IoC容器。将对象的创建、依赖管理的控制权从代码内部转移到外部容器。

AI开发架构师 838

IOC原理

转自:http://blog.youkuaiyun.com/u012561176/article/details/45974315IOC的基础知识以及原理1、IOC理论背景在采用面向对象方法设计的软件系统中,底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。即软件系统中对象之间的耦合,对象A和对象B之间有关联,对象B又和对象C有依赖关系,这样对象和对象之间有着复杂的依赖关系,所以才

soputasmile的笔记 1719

避坑指南:麒麟系统ARM架构下PostGIS离线安装常见问题解析

本文深度解析了在国产麒麟系统ARM64架构下进行PostGIS离线安装的完整路径与核心避坑点。通过对比Docker容器化与源码编译两种部署方式的优劣,详细阐述了离线Docker环境搭建、ARM64镜像获取验证、容器化配置及常见故障排查的全流程,为在特殊环境下稳定部署空间数据库提供了一套可靠的实践指南。

Python的专栏 287

浅谈IOC--说清楚IOC是什么

1.IOC的理论背景 2.什么是IOC 3.IOC也叫依赖注入(DI) 4.IOC的优点 5.IOC容器的技术剖析 6.IOC容器的一些产品

weixin_55817753的博客 263

鸿蒙平板PC应用开发:在termux中安装ubuntu

打开AVNC点击右上角的设置图标,然后点击 输入 , 点击手势栏目中的 单指轻扫 ,选择滚动远程内容

DMZDAMS的博客 5201

交叉熵损失函数基本概念及公式

对于二分类问题,模型的输出通常是一个标量,表示样本属于正类的概率。因此,在二分类的交叉熵损失函数中,我们只需要考虑一个概率值,即模型预测为正类的概率。具体来说,当真实标签为1时,我们关注模型预测为正类的概率;当真实标签为0时,我们关注模型预测为负类的概率。因此,二分类的交叉熵损失函数可以表示为:其中,y 表示真实标签,取值为 0 或 1;p 表示模型预测为正类的概率。而对于多分类问题,模型的输出通常是一个向量,表示样本属于各个类别的概率。因此,在多分类的交叉熵损失函数中,我们需要考虑所有类别的概率。

qlkaicx的博客 1万+

【IOC框架】分析与理解

1 IoC理论的背景我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由N个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。图1:软件系统中耦合的对象如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针、分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿轮组,它拥有多个独立的齿轮,这些齿轮相互啮合在一起,协同工作,共同...

weixin_34153893的博客 4081

高温环境下RS485通信故障分析与MOS管解决方案

RS485通信作为工业控制领域的基础总线技术,其可靠性直接影响系统稳定性。在高温等恶劣环境下,传统三极管开关电路会因温度特性导致通信故障。通过分析三极管Ube电压随温度变化的特性,揭示了电路失效的物理原理。相比之下,MOS管作为电压控制型器件,具有温度稳定性好、功耗低等优势,更适合工业环境应用。本文通过一个发动机舱内RS485通信故障的实际案例,详细对比了三极管与MOS管在高温环境下的性能差异,并给出了具体的电路改进方案。该案例对工业通信接口设计具有普遍参考价值,特别适用于需要应对高温、振动等挑战性环境的硬

weixin_42612405的博客 406

DNS原理解析(可能是对DNS最通俗易懂的解释)

转自公众号:网络技术平台 https://mp.weixin.qq.com/mp/profile_ext?action=home&__biz=MzkwMjEwMDI2Nw==&scene=161&uin=&key=&devicetype=Windows+10+x64&version=63020179&lang=zh_CN&a8scene=1&session_us=gh_6bddc706756e&fontgear=2 DNS ​

ttyyzzbb的博客 791

IEC61850规约客户端软件开发实战(第六章)

IEC 61850标准中的GOOSE(Generic Object Oriented Substation Event,面向通用对象的变电站事件)功能是变电站自动化系统的核心通信机制,主要用于实现智能电子设备(IED)间高可靠性、低延时的实时信号传输。本章简述其核心功能与技术特点。

半青年的博客 1779

学Simulink——基于Simulink的输入-输出线性化精确转矩控制

本文详细介绍了基于Simulink的永磁同步电机(PMSM)输入-输出线性化(IOL)精确转矩控制方法。针对传统解耦控制在非线性转矩特性下的局限性,提出通过精确反馈线性化实现转矩指令与实际转矩的严格线性关系。文章系统阐述了IOL原理、PMSM控制器推导过程,并提供了完整的Simulink建模步骤,包括电机模型搭建、IOL控制器实现和闭环系统构建。通过仿真对比验证了IOL方法在转矩跟踪精度、动态响应和参数鲁棒性方面的显著优势,最后讨论了工程实现要点和扩展应用方向。该方法为高性能伺服系统开发提供了有效解决方案。

amy_mhd的博客 60

Python爬虫五:微信公众号爬虫-2018.9

环境:Windows7 +Python3.6+Pycharm2017 目标:抓取微信公众号全部历史文章(文章名+url)保存到本地csv。 ---全部文章: 京东爬虫 、链家爬虫、美团爬虫、微信公众号爬虫、字体反爬、Django笔记、阿里云部署、vi\vim入门---- 分析:关于微信公众号的爬取,网上搜索了一下,主要有几种方法: 一、搜狗微信公众平台 http://weixin.sogo...

老王の博客 1万+

(2)NPW(监控片)【中】---业务场景精讲

自己在日常工作当中,由于非产线人员出生,对NPW的知识一直一知半解,业务场景认识的不够透彻,做系统的时候很难理解甲方的NPW业务应用,特收集了不少关于NPW的一些业务场景,下面都是一些摘抄,大家关注我标红标粗的部分,

阿拉伯梳子的专栏 1588

Spring之IoC容器篇

Spring是一个开源的应用程序开发框架,它由Rod Johnson创建,主要用于构建企业级Java应用程序。它提供了一个全面的编程和配置模型,可以简化Java开发过程,提高开发效率和可维护性。即为了解决企业应用开发的复杂性而创建的。Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。目的:解决企业应用开发的复杂性功能:使用基本的JavaBean代替EJB,并提供了更多的企业应用功能范围:任何Java应用简单来说,

kissship的博客 1864

移动端HDR

移动HDR是近年来移动设备最大的技术进步之一。自2017年起,它就开始出现在旗舰手机上,包括苹果(Apple)和三星(Samsung)在内的大多数制造商都加入了这一行列。这一趋势在过去几年里席卷了整个电视行业,但在最近几年才真正深入人心。而且,最近,将更多的HDR内容放到移动设备上的趋势已经加快。对于这种新兴技术来说,它还处于相对早期的阶段,但它也非常有趣,值得关注。 HDR是什么? HDR是...

ISP行业的忠实粉丝 1340

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Java-24 深入浅出 Spring 全景:从起源到 Spring 6 一文打通 IoC / AOP / 发展史

Spring 是面向 Java 平台的分层 Full-Stack 轻量级开源框架,以控制反转(IoC)和面向切面编程(AOP)为核心理念,简化企业级应用开发。本文系统讲解 Spring 的发展历程:2003 年 Rod Johnson 推出雏形,2004 年 3 月发布 1.0 正式版,2006 年 Spring 2.0 引入 XML Schema 命名空间,2009 年 12 月 Spring 3.0 基于 Java 5 并引入 SpEL,2013 年 12 月 Spring 4.0 全面支持 Java

谢谢你的喜欢 我们一起无限进步 5186

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

java ioc是什么意思_Spring中的IOC是什么意思

这里是修真院后端小课堂,每篇分享文从【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】八个方面深度解析后端知识/技能,本篇分享的是:【Spring中的IOC是什么意思 】【修真院java小课堂】Spring中的IOC是什么意思大家好,我是IT修真院武汉分院第17期的学员汪天驰,一枚正直纯洁善良的java程序员,今天给大家分享一下,修真院官网java任务...

weixin_39606799的博客 741

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

Spring的IOC

这里是修真院后端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析后端知识/技能,本篇分享的是: 【 Spring的IOC】 大家好,我是IT修真院上海分院第02期学员,一枚正直纯洁善良的Java程序员。今天给大家分享一下,修真院官网JAVA(职业)任务1的知识点——Spring的IOC。 1.背景...

IT修真院:初学者转行到互联网的聚集地 353

Spring的IOC原理(通俗易懂)

1. IoC理论的背景 我们都知道,在采用面向对象方法设计的软件系统中,它的底层实现都是由Ñ个对象组成的,所有的对象通过彼此的合作,最终实现系统的业务逻辑。 如果我们打开机械式手表的后盖,就会看到与上面类似的情形,各个齿轮分别带动时针,分针和秒针顺时针旋转,从而在表盘上产生正确的时间。图1中描述的就是这样的一个齿...

love_everybody的博客 4万+

狂神Spring学习笔记 IOC理论(ioc的创建方式,DI注入)

7.bean的自动装配 自动装配是spring满足他们bean依赖一种方式 spring会在上下文中自动寻找,并自动给bean装配属性 在spring中三种装配的方式 1.在xml中显示的配置 2.在Java中显示配置 3.隐式的自动装配 [重要] 7.4使用注解进行装配 1.导入约束 : context 2.配置注解支持 ...

weixin_47614770的博客 977

spring技术原理-IOC实现原理

IOC的基础 下面我们从IOC/AOP开始,它们是Spring平台实现的核心部分;虽然,我们一开始大多只是在这个层面上,做一些配置和外部特性的使用工作,但对这两个核心模块工作原理和运作机制的理解,对深入理解Spring平台,却是至关重要的;因为,它们同时也是Spring其他模块实现的基础。从Spring要做到的目标,也就是从简化Java EE开发的出发点来看,简单的来说,它是通过对POJO开发的支...

liu_lnovice的博客 345

Spring中的IOC是什么意思

这里是修真院后端小课堂,每篇分享文从 【背景介绍】【知识剖析】【常见问题】【解决方案】【编码实战】【扩展思考】【更多讨论】【参考文献】 八个方面深度解析后端知识/技能,本篇分享的是: 【Spring中的IOC是什么意思 】 【修真院java小课堂】Spring中的IOC是什么意思 大家好,我是IT修真院武汉分院第17期的学员汪天驰,一枚正直纯洁善良的java程序员,今天给大家分享一...

IT修真院:初学者转行到互联网的聚集地 562

[Spring框架]Spring IOC的原理及详解

Spring IOC的原理及详解1. IOC理论的背景2. 什么是控制反转(IOC)3. IOC的别名:依赖注入(DI)4.IOC为我们带来了什么好处5. IOC容器的技术剖析6. IOC容器的一些产品7. 使用IOC框架应该注意什么 这里感谢 优快云 的原博客:http://blog.youkuaiyun.com/m13666368773/article/details/7802126 https:/...

xujunson的博客 434

Spring01-背景及控制反转(IOC)

Spring是什么: Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IOC(inverse of control:反转控制)和AOP(Aspect Oriented Programming:面向切面编程)为内核,提供了展现层Spring MVC 和持久层Spring JDBC 以及业务层事务管理等众多的企业级应用技术,还能整合开源世界众多著名的第三方框架和类库...

悲伤的面包的博客 245
上一篇: 【Java进阶营】Spring的系统架构
下一篇: 【Java进阶营】Spring开发环境的搭建
java364103
博客等级 码龄5年 2粉丝 10原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值