Spring系列(5)---IOC技术.

Spring IoC源码学习:总览 前言 Spring 作为现在最优秀的框架之一,被广泛的应用于 Java 项目中,但是大多数人都只知道如何使用,而不知其中的原理。对大多数人来说可能知道如何使用已经足够了,但是对于想提升自己的人来说,学习 Spring 的源码是一个不错的选择。在过去的几个月里,我利用空闲时间将 IoC 的相关源码学习了一下,按照老习惯准备整理成笔记,以博文的形式记录下来,供自己以后使用,也供其他网友参考。由于涉及... 阅读详情

说实话,我对Spring技术还是不算很了解,IOC的技术我在实体框架技术中提到过,但IOC和AOP作为Spring技术的两个核心思想,我觉得在总结之前,还是有必要说明一下我所理解的IOC.

我们知道,如果两个事务之间存在逻辑关系,而且你需要根据这个逻辑关系做事,(比如类A和类B,类A需要调用类B的方法,比如ORM等),那么该做的事情,其实一件都不会少的,只是我们可以利用一些技术手段来减少直接的依赖或者叫硬代码依赖。IOC的核心其实就是利用辅助配置信息和编程语言提供的反射机制来替代这种硬关联,举个例子:

interface IB;

public class B1:IB;

public class B2:IB;

IB是一个接口,实现这个接口的类有2个:B1和B2,如果类A要调用这个接口,那么接口必须有一个实例来支持,我们看看几种用法:

为了说明简单,我们假设程序中只需要使用其中一个B类。

第1种方式(直接使用):

根据配置信息来创建B

IB theIB = new B1(),或者IB theIB = new B2(),

然后调用我们需要的方法,但这种方式有一个问题,就是判断使用B1还是B2的,以及实例化每次都要这么写,一是比较麻烦,二是没有收窄创建逻辑(如果创建逻辑发生变化,我们得到处改代码),因此我们做一个改进:

第2中方式(创建工厂):

public class CreateBfactory
{
       public  IB CreateInstanceForB()
       {                

           在这里根据配置信息来创建B
            IB theIB = new B1(),或者IB theIB = new B2(),
            返回实例theIB
       }

}

第2种方式,对于一般的情况应该是够用了,但有的时候,创建逻辑比较简单,或者是不想要这个创建逻辑,而是在程序配置文件中直接指明用什么,这就是第3种方式。

第3种方式(配置):

这里假设配置格式是:<interface="IB" usingclass="B1" assembly=""....>
一般的情况下,我们要创建一个类实例,是必须知道类类型的,我们在代码中无法直接用类名字符串来创建实例的,但由于很多语言都支持根据元数据,并根据元数据动态创建实例,那么我们当然就可以利用这种配置信息来创建类实例。在C#中的代码其实很简单:

string theTypeName = "完全类名,程序集名";//完全类名包括了命名空间的完整类型名,注意大小写,程序集名则是要实例化类所在的程序集,如果在当前加载的程序集中,可以不写。
Type theTargetType =  Type.GetType(theTypeName );

然后调用Activtor.CreateInstanceFrom(theTargetType )就可以动态构建。

如果我们的系统中存在着大量这样的类需要创建,而且创建逻辑简单,那么采用这种方式有如下好处:
1)只要写一个根据配置文件创建目标实例的工厂类,大大减少了代码;
2)如果要将B1换到B2,我们只需要改配置文件,而不需要修改程序,当然也就不需要重新编译程序了
3)为按需加载程序集,动态加载程序集提供了可能。

第3种方式其实就是典型的IOC.至于配置信息是放在数据库还是文件里,存什么格式都可以根据自己的需要来决定,甚至可以根据命名规范来进行(比如我的数据访问类根据数据库类型的不同分为不同的版本类,我就直接利用命名规范来实现配置,比如接口I_Name,Oracle版:C_Name_O,因为程序集是肯定会加载的,我就可以根据I_Name的类型名加上采用哪个数据库的配置信息就可以轻松创建需要的实例)。当然,根据配置文件我们还可以完成很多更为复杂的事情,但原理是一样的。

IOC:配置信息+类的动态实例化技术。

不过这种技术并不适合创建逻辑复杂的地方,一是因为如果配置文件过于复杂,本身也难以维护,二是配置文件所能表达的逻辑也有限。IOC特别适合创建逻辑简单,配置信息形式统一,但量比较大的地方。

Spring5.0源码学习系列之核心技术IoC概述(三) IOC:Inversion of controll(控制反转 / 反转控制),ioc是一种技术思想,在spring框架开发之前就已经提出来的,spring框架对ioc技术思想进行了很好的实现 对控制反转的理解:控制反转(IOC)可以理解为获取依赖对象的方式反转过来,有反转就有“正转”,所谓“正转”可以这样理解,“正转”就是常规的获取对象方式,比如类A依赖于类B,在类A中要获取类B,就是new一个B对象既可,这种就是“正转“,这种方法 阅读详情

相关推荐

Spring5.0源码学习系列之浅谈IoC初始化主流程(四)

在上一章的学习中,我们已经比较详细地介绍了Spring IoC容器和简单应用,本文接着学习,可以参考Spring官网对IoC容器做了比较详细介绍,其中就指出了IoC容器在Spring框架中的实现核心是通过ApplicationContext,也可以说ApplicationContext是Spring IoC容器的表现

Nicky's blog 3174

IOC简述

ioc面试前必看

weixin_44402870的博客 1229

IOC技术介绍

介绍IOC模式及实现类

一文读懂 IOC

9.1 总结控制反转(IOC)作为现代软件开发中的重要设计思想,通过容器的管理实现了模块解耦和依赖注入。它的核心价值在于解耦和灵活性,使得代码更容易维护、更具扩展性。IOC 的核心价值将对象的创建和依赖管理交由容器处理,降低模块间的耦合。容器支持运行时动态注入,便于调整和扩展依赖关系。模块之间关系清晰,代码更易读、更易维护。容器可以轻松替换依赖项为 Mock 实现,提升测试效率。IOC 的广泛应用。

hello.reader 4895

PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计

PHP+MYSQL宠物主题动态网页设计源码+数据库,大学生期末大作业,PHP课程设计提示:本文采用PHP对数据库进行操作:本文就介绍了PHP实现对MySQL数据库的增删改查操作基础内容。

901

不用敲命令!用宝塔面板可视化部署pbootCMS的保姆级教程(2024最新版)

本文提供2024年最新版pbootCMS可视化部署教程,全程使用宝塔面板操作,无需任何命令行知识。从服务器初始化、LNMP环境配置到源码上传、安装向导,手把手指导用户通过图形化界面快速搭建专业网站,适合零基础新手和追求高效建站的用户。

weixin_42509507的博客 490

IOC(控制反转)

4.1.什么是Bean:Spring容器中的核心组件在Spring框架中,Bean是由Spring IOC容器管理的对象,代表应用程序中的组件。Bean可以是任何Java对象,比如服务类、数据访问层类或其他业务逻辑类。Spring容器通过读取配置或注解,管理这些Bean的生命周期,包括创建、配置、依赖注入和销毁。Bean是Spring应用程序的基本构建块,Spring容器通过依赖注入来管理这些对象的依赖关系,从而实现松耦合设计。4.2.配置Bean的多种方式。

m0_73837751的博客 6531

手眼标定(EyeToHand)推导

Base为基坐标系(B),工具末端坐标系(T),标定板为Mark坐标系(M),相机坐标系(C)对于每两个姿态都存在上式,组成一个AX=XB的矩阵方程,X为。此时转换成AX=0的问题,单纯用SVD求奇异解便可得到。相机坐标系到Base基坐标系下的转换关系。已知标定板与机械臂末端的相对位置固定不变,,即。带入(2)式求,至此求解出需要的手眼矩阵。在眼在手外的时候,其实是要求解。

stevenreally6的博客 1143

【Spring】一文带你吃透IOC技术

loC,Inversion ofControl:控制反转,是一个理论,一个指导思想。指导开发人员如何使用对象,管理对象的。把对象的创建,属性赋值,对象的声明周期都交给代码之外的容器管理。loC分为控制和反转 ●控制:对象创建,属性赋值,对象声明周期管理。 ●反转:把开发人员管理对象的权限转移给了代码之外的容器实现。由容器完成对象的管理。 ●正转:开发人员在代码中,使用new构造方法创建对象。开发人员掌握了对象的创建,属性赋值,对象从开始到销毁的全部过程。开发人员有对对象全部控制。通过容器....

YOU__FEI的博客 9404

Materials Studio与LAMMPS联合作战:如何用msi2lmp.exe完美转换聚合物模型(含PCFF力场配置)

本文详细解析了如何利用msi2lmp.exe工具将Materials Studio中的聚合物模型高效、准确地转换为LAMMPS可识别的data文件,并重点配置PCFF力场。文章提供了从MS模型构建、文件导出到命令行转换、参数调整及转换后验证的全流程实战指南与避坑技巧,旨在帮助研究者解决模型转换中的常见问题,实现跨平台分子动力学模拟的无缝衔接。

weixin_29228781的博客 520

在VS2019里把JSBSim飞行模型集成到你的C++项目里(附完整配置流程和常见错误解决)

本文详细介绍了如何在Visual Studio 2019中将JSBSim飞行模型集成到C++项目中,包括环境准备、源码编译、项目配置和常见错误解决方案。通过实战技巧和优化建议,帮助开发者高效实现高精度飞行仿真功能,提升开发效率。

weixin_42620202的博客 413

Spring | 一文带你掌握IOC技术

IOC 控制反转1、概念IOC(Inversion of Control):控制反转什么是控制反转呢?使用对象时,由主动new产生对象转换为由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。Spring和IOC之间的关系是什么呢?Spring技术对IOC思想进行了实现,Spring提供了一个容器,称为IOC容器,用来充当IOC思想中的"外部",IOC思想中的"外部"指的就...

Java架构技术 309

仅使用 Python 创建的 Web 应用程序(前端版本)第03章Streamlit-多页面

接下来,我们将解释多页面切换。Streamlit 没有“多页面”或“页面路由”等功能。另一方面,通过根据用户动作切换要执行的功能,可以使其看起来好像存在“多个页面”。注意:我认为它类似于 SinglePageApplication (SPA)。然而,根据 React、Vue 等中使用的 URL 路径来更改页面的路由很困难。还有一个用于获取查询参数的实验性 API,但如果您确实需要这种功能,我认为认真尝试编写 React 或 Vue 是个好主意。我们来看一个通过按下按钮来切换页面的示例,如下所示。

xianyinsuifeng的博客 1330

手撕Spring底层系列之:IOC、AOP

优秀的框架设计,往往是把复杂留给自己,把简单留给使用者。Spring的成功正是这一理念的完美实践——通过IoC容器标准化对象生命周期,通过AOP解耦横切关注点,最终实现开发效率的质的飞跃。IoC的本质是管理权转移:将对象的控制权从程序员手中移交至容器,通过三级缓存等精妙设计解决工程难题AOP的根基是代理模式:动态代理技术使非侵入式功能扩展成为可能,JDK与CGLIB的互补成就了Spring的灵活性手写轮子的终极意义。

Rqaqedamancy的博客 1万+

《QGIS快速入门与应用基础》209:重叠标注处理(移除/偏移)

系统讲解了QGIS中处理标注重叠问题的核心方法与实操流程。文章首先阐述了重叠标注处理的底层逻辑,即 先预防、再调整、后兜底 的递进式策略,并详细介绍了设置入口与界面布局。重点讲解了偏移处理这一首选方案,包括基础方向设置、最大偏移距离与步长配置、以及自动换行等进阶优化规则。针对不同要素类型(点、线、面)提供了行业规范的偏移方向设置建议,并给出从稀疏到密集场景的完整参数推荐值。最后以城市POI点图层为例,演示了5步偏移设置流程,帮助用户实现 无重叠、无压盖、重点突出 的专业标注效果。

LuckyHanMo的博客 672

PCL 改进快速欧式聚类【2025最新版】

在FEC: Fast Euclidean Clustering for Point Cloud Segmentation一文的基础上对算法进行改进。博客长期更新,本文最近更新时间为:2025年9月16日。

点云侠的博客 2570

Spring中IOC详解

一、IOC的原型 IOC ----控制反转 比如我们有一个功能是获取用户数据,我们使用Dao层实现这个功能,再在Service层调用这个功能。但是我们每增加一个接口,比如获取mysql中的数据,就要修改原来的代码,如果再增加一个新的接口,又需要去service实现类中修改对应的实现。 解决方法 用户实际调用的是业务层,dao层他们不需要接触 UserServiceImpl userService = new UserServiceImpl(); userSe

qq_41359998的博客 1万+

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Spring IoC容器

核心技术 发行版5.0.8 这一部分的指导文档覆盖了所有的完全集成到Spring框架中的技术。 这些技术中首要的便是Spring框架的控制反转(IoC)容器。Spring框架的IoC容器的全面的处理是与Spring的面向切面编程(AOP)的彻底实现紧密相关的。Spring框架拥有他自己的AOP框架,该技术在概念上是很容器理解的,并且成功的解决了在Java企业编程中的AOP需求的80%的点。 该框...

hongbochen1223的专栏 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

spring系列5-IOC的三级缓存

1. demo //Child类依赖Mother类 public class Child { private Mother mother; public Mother getMother() { return mother; } public void setMother(Mother mother) { this.mother = mother; } } //Mother类依赖Child类 public class Mother { private Child chil

yeleits的博客 1470

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

Spring5笔记IOC(一)

spring5学习笔记

学习笔记,相关教程 分享 697

手撸Spring系列2:IOC/DI 思想(源码篇-IOC)

今天的博客将带领大家一起来目睹一番Spring5的源码,透过源码去发掘Spring是如何具体去实现IOC思想的。由于Spring IOC DI 两个源码讲解写一起篇幅会比较长,因此笔者将IOC和DI分成了两篇博客进行讲解。

云丶言的博客 1959
上一篇: 如梦令·编码不知日暮
下一篇: Spring系列(6)---总结(1)
广州接入
广州接入 领域专家: 后端开发技术领域 领域专家: 后端开发技术领域
博客等级 码龄24年 2224粉丝 731原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值