IOC(控制反转)与DI(依赖注入)

iOS控制反转(IoC)与依赖注入(DI)的实现 背景最近接触了一段时间的SpringMVC,对其控制反转(IoC)和依赖注入(DI)印象深刻,此后便一直在思考如何使用OC语言较好的实现这两个功能。Java语言自带的注解特性为IoC和DI带来了极大的方便,要在OC上较好的实现这两个功能,需要一些小小的技巧。控制反转和依赖注入控制反转简单来说,将一个类对象的创建由手动new方式改为从IOC容器内获取,就是一种控制反转,例如我们现在要创建一个Class 阅读详情

IOC(控制反转)与DI(依赖注入)

IOC(控制反转)

  1. 之前在Servlet中,我们创建service对象 ,xxxService xxxService = new xxxServiceImpl();
    这句话如果出现在servlet中的某个方法内部,那么这个xxxService的作用域(生命周期)应该就是这个方法级别; 如果这句话出现在servlet的类中,也就是说xxxService是一个成员变量,那么这个xxxService的作用域(生命周期)应该就是这个servlet实例级别
  2. 之后我们在applicationContext.xml中定义了这个xxxService。然后通过解析XML,产生xxxService实例,存放在beanMap中,这个beanMap在一个BeanFactory中;因此,我们转移(改变)了之前的service实例、dao实例等等他们的生命周期。控制权从程序员转移到BeanFactory。这个现象我们称之为控制反转。
public interface BeanFactory {
    Object getBean(String id);
}
public class ClassPathXmlApplicationContext implements BeanFactory {

    private Map<String,Object> beanMap = new HashMap<>();
    private String path = "applicationContext.xml" ;
    public ClassPathXmlApplicationContext(){
        this("applicationContext.xml");
    }
    public ClassPathXmlApplicationContext(String path){
        if(StringUtil.isEmpty(path)){
            throw new RuntimeException("IOC容器的配置文件没有指定...");
        }
        try {
            InputStream inputStream = getClass().getClassLoader().getResourceAsStream(path);
            //1.创建DocumentBuilderFactory
            DocumentBuilderFactory documentBuilderFactory = DocumentBuilderFactory.newInstance();
            //2.创建DocumentBuilder对象
            DocumentBuilder documentBuilder = documentBuilderFactory.newDocumentBuilder() ;
            //3.创建Document对象
            Document document = documentBuilder.parse(inputStream);

            //4.获取所有的bean节点
            NodeList beanNodeList = document.getElementsByTagName("bean");
            for(int i = 0 ; i<beanNodeList.getLength() ; i++){
                Node beanNode = beanNodeList.item(i);
                if(beanNode.getNodeType() == Node.ELEMENT_NODE){
                    Element beanElement = (Element)beanNode ;
                    String beanId =  beanElement.getAttribute("id");
                    String className = beanElement.getAttribute("class");
                    Class beanClass = Class.forName(className);
                    //创建bean实例
                    Object beanObj = beanClass.newInstance() ;
                    //将bean实例对象保存到map容器中
                    beanMap.put(beanId , beanObj) ;
                    //到目前为止,此处需要注意的是,bean和bean之间的依赖关系还没有设置
                }
            }
            //5.组装bean之间的依赖关系
            for(int i = 0 ; i<beanNodeList.getLength() ; i++){
                Node beanNode = beanNodeList.item(i);
                if(beanNode.getNodeType() == Node.ELEMENT_NODE) {
                    Element beanElement = (Element) beanNode;
                    String beanId = beanElement.getAttribute("id");
                    NodeList beanChildNodeList = beanElement.getChildNodes();
                    for (int j = 0; j < beanChildNodeList.getLength() ; j++) {
                        Node beanChildNode = beanChildNodeList.item(j);
                        if(beanChildNode.getNodeType()==Node.ELEMENT_NODE && "property".equals(beanChildNode.getNodeName())){
                            Element propertyElement = (Element) beanChildNode;
                            String propertyName = propertyElement.getAttribute("name");
                            String propertyRef = propertyElement.getAttribute("ref");
                            //1) 找到propertyRef对应的实例
                            Object refObj = beanMap.get(propertyRef);
                            //2) 将refObj设置到当前bean对应的实例的property属性上去
                            Object beanObj = beanMap.get(beanId);
                            Class beanClazz = beanObj.getClass();
                            Field propertyField = beanClazz.getDeclaredField(propertyName);
                            propertyField.setAccessible(true);
                            propertyField.set(beanObj,refObj);
                        }
                    }
                }
            }
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (NoSuchFieldException e) {
            e.printStackTrace();
        }
    }


    @Override
    public Object getBean(String id) {
        return beanMap.get(id);
    }
}

DI(依赖注入)

  1. 之前我们在控制层出现代码:FruitService fruitService = new FruitServiceImpl();
    那么,控制层和service层存在耦合。

  2. 之后,我们将代码修改成xxxService xxxService = null ;
    然后,在配置文件中配置:

    <bean id="fruit" class="FruitController">
         <property name="fruitService" ref="fruitService"/>
    </bean>
    

    通过读取配置文件来进行赋值。

IoC控制反转 & DI依赖注入 IoC 对于FruitController类 //private FruitService fruitService = new FruitServiceImpl(); //使用new表示Controller和下层的FruitServiceImpl有关系了,当下层改动时本层及以上会受影响 private FruitService fruitService = null ; //改成null 若删除FruitServiceImpl不会报错,但此层因为空指针无法运行 要解决空指针问题, 阅读详情

相关推荐

MobileNet V3 图像分类

MobileNet V3

Henry的博客 1767

Java:控制反转(IoC)与依赖注入(DI)

很长一段时间里,我对控制反转和依赖注入这两个概念很模糊,闭上眼睛想一想,总有一种眩晕的感觉。但为了成为一名优秀的 Java 工程师,我花了一周的时间,彻底把它们搞清楚了。 01、紧耦合 在我们编码的过程中,通常都需要两个或者更多的类通过彼此的合作来实现业务逻辑,也就是说,某个对象需要获取与其合作对象的引用,如果这个获取的过程需要自己实现,代码的耦合度就会高,维护起来的成本就比较高。 我们来通过实战...

沉默王二 7687

vietjetair 航空的webpack多参数生成学习

工作内不是特别多,居安思危,有一个抓机票信息的公司面试前竟然需要做面试题,这就是一个题。看了下,有点麻烦,webpack 最初不得要领,看了下资料,找了个框架,练了两个简单的,搞这个吧。入库需要自己找,有几个参数不是明文的,算法不是很复杂,位置不太好找。整体难度一般。

liu_yueyang的博客 1510

IOC控制反转与DI依赖注入

本文详细介绍了Spring框架中的IOC(控制反转)和DI(依赖注入)核心概念。主要内容包括:1)通过创建Maven项目案例演示XML配置方式管理Bean;2)解释IOC是将对象控制权交给容器管理的思想,DI是实现IOC的具体方式;3)分析Bean的三种装配策略(ByName/ByType)和三种配置方式(XML/Java/注解);4)详解依赖注入的三种方式(setter/构造器/注解)及复杂类型注入;5)介绍常用注解(@Component/@Autowired等)及其区别。

xg_960的博客 1310

超详细 Git创建仓库及上传项目至Github操作(Windows系统)

文章目录前言一、Git下载及安装二、创建代码仓库1.配置身份2.创建本地仓库3.提交本地代码三、使用Git上传代码至Github1.创建ssh keys2.在Github中新建仓库3.关联本地仓库与Github仓库4.推送代码至Github仓库总结 前言 本文对于Windows系统上git的安装及基本使用方法进行简单介绍,并介绍如何使用git将仓库中的项目上传至个人的Github中去。内容参考《第一行代码》以及一些博客。 本文适合新手阅读哦~ 一、Git下载及安装 打开网站 git下载 下载安装包(直接

lijianyi0219的博客 2万+

2023-ICCV-隐式神经网络实现低光照图像增强(NeRCo)论文解读+代码解析

NeRCo()提出了一种名为NeRCo的隐式神经表示方法,用于合作式低光图像增强。现有的低光图像增强方法存在以下三个限制:不可预测的亮度降低和噪声、度量友好版本和视觉友好版本之间的固有差距,以及有限的配对训练数据。为了解决这些限制,论文提出了NeRCo方法,它以无监督的方式稳健地恢复感知友好的结果。具体而言,NeRCo通过一个可控的拟合函数统一了现实场景中多样的退化因素,从而提高了鲁棒性。对于输出结果,论文引入了来自预训练视觉-语言模型的先验信息,采用语义导向的监督方法。

weixin_45595504的博客 3183

控制反转IOC和依赖注入DI详解

本文介绍了Spring框架中的控制反转IOC和依赖注入DI,欢迎阅读,共同学习,一起进步。 Spring框架基础参考:深入学习Spring基础 文章目录一.入门程序和IOC简介二.IOC-控制反转三.DI-依赖注入四. IOC和DI五.Spring框架使用(IoC)六.注入类型的三种方式 一.入门程序和IOC简介 依赖注入或控制反转的定义中,调用者不负责被调用者的实例创建工作,该工作由S...

末尾卡片和博主交流学习! 2864

【加密社】私钥碰撞器,秒杀市面上的碰撞器

基于上述的逻辑和代码,开发了ETH挖掘器(图1.1)这里有个亮点是:1.很多开发者在判断地址是否有效的环节上,用的是查询余额,其实这是不对的,查询余额你可能只能查询对应代币的余额,例如usdt,eth等但是如果用查询交易次数就不一样了,你只要是交易过,我就认为是有效钱包,这样的速度比查询余额要快,也要更准确。2.rpc节点可配置。

加密社的博客 1577

SpringBoot解耦:控制反转(IOC)与依赖注入(DI)

本文深入解析了SpringBoot框架中的控制反转(IoC)和依赖注入(DI)机制。通过对比传统硬编码方式和SpringBoot实现方式的代码示例,阐述了IoC将对象创建权交给容器、DI实现松耦合注入的核心思想。文章详细介绍了三种声明Bean的注解(@Component及其衍生注解)、三种依赖注入方式(构造器/属性/Setter方法)以及解决多Bean冲突的三种方案(@Primary/@Qualifier/@Resource)。

大家好,我是张小白! 1916

高云FPGA系列教程(1):FPGA和ARM开发环境搭建

至此,高云FPGA和MCU开发环境就搭建完成了,整体还是比较简单的,几乎是一键完成,下一篇文章我们进行实际的FPGA和MCU开发。本文是高云FPGA系列教程的第1篇文章。

whik1194的博客 6184

华为OD技术面八股文_C++_02

汇总华为OD面试C++方面计数八股文真题,提供详细解答。

qq_45776114的博客 764

Spring IoC【控制反转】DI【依赖注入】

IoC 是 Inversion of Control 的简写,译为“控制反转”,它不是一门技术,而是一种设计思想,是一个重要的面向对象编程法则,能够指导我们如何设计出松耦合、更优良的程序

很高兴你能看到这里 1820

vscode的launch:program ‘‘ does not exist

如图 一般是由于launch.json文件没有配置好的缘故。在右下角的ADD configuration如选第二个登录: 看到program这一栏,这一栏很重要,一般是选择你CMakelist,编译出来的可执行文件 看我CMakelist, 我生成的可执行文件是test_,所以路径可以这样输入: 我在之前cmake的时候已经有了test_这个文件了 然后就可以运...

狂小虎/Anthony Dave的博客 KuangXiaoHu's Blogs 5万+

控制反转IOC与依赖注入DI

一、名词解释 IoC:Inverse of control,控制反转; DI:Depedency Injection 依赖注入 IoC和DI是从不同角度描述同一件事情,即DI模式是Ioc的具体实现方式,通过引入IoC容器,利用依赖关系注入,实现对象的解耦。

lexinquan的专栏 3313

Camera2Demo

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

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IOC控制反转DI依赖注入详解

IOC:对象的创建控制权给容器了DI:容器自动为应用程序注入它所需的对象。

qq_42736179的博客 1100

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Spring IoC & DI:控制反转与依赖注入

IoC & DI

2401_83595513的博客 1897

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

Spring入门使用:IOC控制反转与DI依赖注入详解

本文介绍了Spring框架的核心概念IOC(控制反转)和DI(依赖注入)。IOC将对象控制权交给Spring容器,通过XML配置实现对象管理;DI则通过setter或构造方法注入依赖对象。文章详细演示了Spring的配置步骤、Bean属性设置及依赖注入方式,包括单例/多例作用域配置和引用类型的注入。通过示例代码展示了如何利用Spring简化JavaEE开发,实现对象间的解耦和灵活管理。

先做到 再看见 1361

Spring的控制反转(IoC)与依赖注入(DI)详解

一、概念: **控制反转(Inversion of Control,英文缩写为IoC)****:****是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 2020整理收集的一线互联网公司面试真题(都整理成文档),有很多干货,包含netty,spring,线程,spring cloud等详细讲解,也有详细的学习规划图,面试题整理等,我感觉在面试这块讲的非常清楚:获取面试资料只需:点击这里领取!!!暗号:优快云 控制反转一般分为两种类型,依赖注入(Dependen

a3961401的博客 3002

什么是IOC(控制反转)、DI(依赖注入)

原文地址(摘要了部分内容):https://blog.youkuaiyun.com/qq_22654611/article/details/52606960/ 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) 、DI(依赖注入)这两个概念,对于初学Spring的人来说,总觉得IoC 、DI这两个概念是模糊不清的,是很难理解的,今天和大家分享网上的一些技术大牛们对Spring框架的IOC...

qq_42709262的博客 8万+

Spring的DI依赖注入和IOC控制反转

1.轻量级:Spring是非侵入性的-基于Spring开发的应用中的对象可以不依赖于Spring的API2.依赖注入(DI---dependency injection、IOC)3.面向切面编程(AOP---aspect oriented programming)4.容器:Spring是一个容器,因为它包含并且管理应用对象的生命周期5.框架:Spring实现了使用简单的组件配置组合成一个复杂的应用。在Spring中可以使用XML和Java注解组合这些对象。

2201_75345199的博客 927

PHP依赖注入和控制反转(DI,IoC)

PHP依赖注入和控制反转(DI&&IoC) User: Jeremy.Ke Time: 2019/6/25 3:32 1 理论分析 1.1 概念 依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。 (1)依赖注入是从应用程序的角度在描述,可以把依赖注入,即:应用程序依赖容器创建并注入它所需要的外部资源; (2)而控制反转是从容器的角度在描...

jeremy_ke的博客 4270

依赖注入IOC和控制反转DI 的一些细节

依赖注入IOC和控制反转DI 的一些细节 IoC——Inversion of Control 控制反转DI——Dependency Injection 依赖注入 要想理解上面两个概念,就必须搞清楚如下的问题: 参与者都有谁? 依赖:谁依赖于谁?为什么需要依赖? 注入:谁注入于谁?到底注入什么? 控制反转:谁控制谁?控制什么?为何叫反转(有反转就...

ai_64的博客 2071

控制反转( IoC)和依赖注入(DI)

控制反转( IoC)和依赖注入(DI) tags: 容器 依赖注入 IOC DI 控制反转 引言:如果你看过一些框架的源码或者手册,像是laravel或者tp5之类的,应该会提到容器,依赖注入,控制反转等词汇。或者是某些面试官会问到这类问题。希望这篇文章能让你有所收获。 1.1、IoC(控制反转 Inversion of Control) 简述:控制反转并不是一种技术,而是...

vinter_he 1万+

什么是控制反转(IoC)?什么是依赖注入(DI)?两者关系如何 ?

什么是控制反转(IoC)?什么是依赖注入(DI)?两者关系如何 ? 1. IoC是什么? IoC(Inversion of Control) – 控制反转。它不是一种技术,而是一种思想。要理解什么是控制反转。那么我们就要理解“是谁控制谁呢,为什么是反转呢”。 是谁控制谁:在传统的Java SE程序设计,我们要使用对象要在对象内通过new来创建,即应用程序主动创建依赖对象。而IoC是一个专门创建依赖对象的容器。即容器控制对象。 为什么是反转:因为IoC帮我们创建并注入依赖对象,对象只是被动地接受依赖对象(传

LoveSongi的博客 1317

控制反转 IOC 与依赖注入 DI

引言 简单总结和巩固一下spring的核心原理——IOC和DI的概念,为什么IOC要叫控制反转?IOC和DI的关系是怎样的? 一、IOC 控制反转 初学者可能很好奇,为什么spring framework的对象托管容器叫做 IOC容器(Inversion of control)? 设想这样一个场景,A对象依赖B对象。如果 new A,就需要先 new B,这是最基本的依赖创建方式。我们管 A 去申请 B 对象的过程,称为“资源查找”,可以理解为 A 对象需要向虚拟机申请一个资源 B 对象。 传统

Morty的技术乐园 760

依赖注入(DI)和控制反转(IOC)

首先要解决的两个问题。1.什么是控制反转和依赖注入2.为什么我们需要控制反转和依赖注入什么是控制反转和依赖注入控制反转(Inversion of control) 是一种解耦的思想,它顾名思义,就是控制权的转移,比如项目经理让你改需求,这里就发生了控制权的转移,主要有三步:1.项目经理要求你添加功能 (这时,控制权在项目经理)2.你接到通知后开始添加功能需求 (控制权在你手上)3.交付需求成品(控制

小辣抓 4767
上一篇: AJAX请求
下一篇: SpringMVC
Sancean
博客等级 码龄6年 2472粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值