[angularjs之我见] AngularJs 的DI实现

系统执行过程:
1.创建Module
2.注册Provider
3.配置Provider
4.RUN


一、providerCache 用来存储 [provider结构]

预先存储
1.$provide
providerCache.$provide =  {
    provider: supportObject(provider),
    factory: supportObject(factory),
    service: supportObject(service),
    value: supportObject(value),
    constant: supportObject(constant),
    decorator: decorator
}


2.$injector: providerCache.$injector = providerInjector =  createInternalInjector() = {
    invoke: invoke,
    instantiate: instantiate,
    get: getService,
    annotate: createInjector.$$annotate,
    has: function (name) {
        return providerCache.hasOwnProperty(name + providerSuffix) || cache.hasOwnProperty(name);
    }
}

3. 通过$provide.provider向providerCache注册其他的provider
    function provider(name, provider_) {
        assertNotHasOwnProperty(name, 'service');
        if (isFunction(provider_) || isArray(provider_)) {
            provider_ = providerInjector.instantiate(provider_);
        }
        if (!provider_.$get) {
            throw $injectorMinErr('pget', "Provider '{0}' must define $get factory method.", name);
        }
        return providerCache[name + providerSuffix] = provider_;
    }

整个注册过程:
1. setupModuleLoader得到Module
2. 通过Module的provider()方法开始注册provider
3. 将provider预先放到invokeQueue中,包含:
    [provider=>'$provide', method=>'provider(),service(),factory()',
        arguments=>'recipeName, factoryFunction'
    ]
4. runInvokeQueue 来执行 invokeQueue
    function runInvokeQueue(queue) {
        var i, ii;
        for (i = 0, ii = queue.length; i < ii; i++) {
            var invokeArgs = queue[i],
                provider = providerInjector.get(invokeArgs[0]);

            provider[invokeArgs[1]].apply(provider, invokeArgs[2]);
        }
    }

5.通过providerInjector的getService('$provide')获取 $provide

6.$provide的provider()将provider放入providerCache

二、整个配置运行过程

1.setupModuleLoader得到Module
2.通过Module的config()方法开始配置
3.将配置模块预先放到configBlocks中,包含:
    [provider=>'$injector', method=>'invoke()',
        arguments=>'configFn'
    ]
4. runInvokeQueue 来执行 configBlocks
5.通过providerInjector的getService('$injector')获取 $injector

6.$injector的invoke进行 provider的DI,此时的provider为注册时的[provider结构]
因此被DI的provider应该使用名字+"Provider",否则会提示错误。
    throw $injectorMinErr('unpr', "Unknown provider: {0}", path.join(' <- '));

注:
$injector.get 为得到[provider结构]
$injector.invoke 为对[provider结构]的DI

三、instanceCache 用来存储 [provider的实例]

1. $injector:instanceCache.$injector = instanceInjector = createInternalInjector();

instanceInjector.invoke 进行各种 [provider实例]的 DI

注:
$injector.get 为得到[provider实例]
$injector.invoke 为对[provider实例]的DI

四、Module的创建
    通过 setupModuleLoader进行模块创建:
    参数1: 模块名称
    参数2: requires
参数3: 配置函数,类似于 module.config


五、providerInjector和instanceInjector
    providerInjector [provider结构]注入器
    instanceInjector [provider实例]注入器

Qt开发者必看:QTimer::singleShot的5个实战避坑指南(含lambda和多线程案例) 本文为Qt开发者提供了QTimer::singleShot的5个关键实战避坑指南,涵盖lambda捕获、对象生命周期和多线程安全等核心难点。通过对比错误与正确代码示例,深入解析了如何避免悬空指针、确保线程执行上下文正确以及管理定时任务资源,帮助开发者编写更健壮、可靠的延迟执行代码。 阅读详情

相关推荐

STM32F103VET6实战:用W25Q64外部Flash实现Bootloader+Application双备份(含完整代码解析)

本文详细介绍了基于STM32F103VET6微控制器和W25Q64外部Flash实现Bootloader+Application双备份固件升级的完整方案。通过精心设计的Flash分区策略、可靠的Bootloader程序以及包含双重校验和自动回滚机制的升级流程,有效解决了远程升级过程中断电导致设备变砖的风险,确保了工业嵌入式系统的高可靠性与稳定性。

linux的博客 823

Angular依赖注入 DI详解

DI(Dependency and Injection)是一种重要的设计模式,并被用于Angular框架中。一篇文章教你入门angular的DI使用方式。

So_I_like的博客 425

线性回归做糖尿病分析(diabetes数据集),并分析单个特征值与病情的关系

1.diabetes数据集 共442个样本,每个样本有十个特征,分别是 [‘age’, ‘sex’, ‘bmi’, ‘bp’, ‘s1’, ‘s2’, ‘s3’, ‘s4’, ‘s5’, ‘s6’],对应年龄、性别、体质指数、平均血压、S1~S6一年后疾病级数指标。 Targets为一年后患疾病的定量指标,值在25到346之间。 ...

t18438605018的博客 1万+

原创:Javascript DI!Angular依赖注入的实现原理

DI是Angular的特色功能,而在Angular 2.0的计划中,DI将成为一个独立的模块,参见https://github.com/angular/di.js 这意味着它也有机会被用于nodejs等技术中,其他前端框架也完全有机会使用它。 DI简介 对于后端程序员,特别是java、.NET程序员来说,DI是个无须解释的概念,但是对前端程序员则比较陌生,我只简单的说一下DI的概...

weixin_34117522的博客 247

MDB协议中设备级别和选项(Levels and Options)

MDB协议的LEVEL级别介绍

hbstart的博客 939

Pytorch实现softmax多分类

PyTorch实现softmax多分类

天涯雨的博客 1387

AngularJS中的DI

AngularJS中的DI一直以为Angular中的DI是很高大上的东西,也自己写过一个DI的demo,知道其中的难点就是最后动态代码的执行:我现在知道了参数的值,也知道了我要执行的方法/创建对象的类,那么在参数个数是动态的情况下,怎么才能执行这个方法或者新建对象呢?在我的demo中我选择的是用eval可是当我看到AngularJS源码中有如下的语句时: 1 switch (self ? ...

weixin_30606669的博客 143

Python数据爬取超详细讲解(零基础入门,老年人都看的懂)

Python数据爬取超详细讲解(零基础入门,老年人都看的懂)

python03011的博客 3751

Angular的DI(依赖注入)

DI:依赖注入,是一种设计模式,很多优秀的框架都实现了这种模式,比如spring框架。angular自身也实现了一套依赖注入,只需要把主要的服务在用到的类的构造函数注入就可以。 一般我们需要依赖注入的都是一些获取数据的服务,要让一个类成为可注入的服务就需要使用@Injectable()装饰器。 设置注入服务有三种方式,三者选其一即可 在服务本身的 @Injectable() 装饰器中。 在 NgModule 的 @NgModule() 装饰器中。 在组件的 @Component() 装饰器中。 @Inje

cc的博客 912

搬运机器人系列编程:KUKA KR QUANTEC_(2).KUKA KRL语言编程基础

定义一个函数END!调用函数PRINT "结果: ", result!定义一个过程PRINT msgEND!调用过程printMessage("欢迎使用 KUKA 机器人")!定义搬运零件的起始位置和目标位置!定义焊接路径的各个点!定义喷涂路径的各个点KUKA Robot Language (KRL) 是一种专门为工业机器人设计的编程语言,具有结构化编程、丰富的库函数、实时性以及集成性等特点。

zhubeibei168的博客 1246

9.9华为OD机试真题 新系统 - 受限任务分配 (Java/Py/C/C++/Js/Go)

华为OD机试真题 新系统【受限任务分配】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【受限任务分配】多语言题解。

qq_45776114的博客 727

AngularJS依赖注入详解:gh_mirrors/bu/buildfirst项目中的DI设计模式

gh_mirrors/bu/buildfirst项目是一个专注于JavaScript应用设计的开源项目,采用"构建优先"的方法,包含了丰富的代码示例和片段。其中,AngularJS依赖注入(DI)设计模式是项目中的重要内容,它为应用提供了模块化、可测试和松耦合的架构基础。 ## 什么是AngularJS依赖注入? 依赖注入是AngularJS的核心特性之一,它允许开发者将组件所需的依赖项传递给

gitblog_00970的博客 494

系统分析师论文范文(三)微服务

摘要(300字) 2024年4月,我作为系统分析师参与某省三甲医院云影像系统建设项目,负责系统分析与设计工作。该项目旨在响应国家"无胶片化"医疗政策,解决传统影像系统数据孤岛、调阅效率低等问题。系统基于DICOM 3.0和HL7国际标准,采用B/S架构与Spring Cloud Alibaba微服务技术栈,包含影像采集、智能分析、数据安全等核心模块,实现全院影像资源的云端统一管理与多端调阅。在架构设计上,通过微服务拆分、分布式事务控制及多层次安全防护机制,保障了系统的高可用性与数据一致性。系统于2024年1

echo的博客 220

AngularJS 浅谈DI-依赖注入 $injector的神奇之处

前言依赖注入(DI)和控制反转(IOC)都是java Spring里经典的面向对象编程的法则来削减计算机程序的耦合问题的解决方案。 在Angular中,引入了DI的思想,DI是一种工具思想,而不是一种目的,它的目的是为了降低程序代码之间的耦合。Angular的启动方式先看一下angular究竟是怎么启动的。 在等待DOM解析完毕后,触发DOMContentLoaded事件时,angular会尝试

小辣抓 1107

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

精雕软件(JDpaint) 5.5 绿色版

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

再谈angularjs DI(Dependency Injection)

依赖注入简述 | DI in a nutshell 对象或者函数只有以下3种获取其依赖(的对象)引用的方式: 依赖可以被使用者自己创建,通过 new 操作符.依赖可以通过全局变量(如 window)来查找并引用依赖可以在需要的地方被传入 前两种创建或查找依赖的方式并不是最优的,因为他们对依赖进行了硬编码. 这就使得当依赖变得不可用时,要修改依赖相关的代码变得非常困难和繁琐。在测试中更是有

弹指天下 869

Camera2Demo

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

[angularjs之我见]注入器

刚开始看angularjs时,总是云里雾里的,出现了很多新的理念。最后硬着头皮看源码,还真发现许多奇妙处,记录下来: 注入器Injector:   anguarjs的注入器主要是用来将provider作为参数注入到被注入的函数中。 其包合: 1.invoke(fn, self, locals):通过fn的参数列表(获取[]方式指定,或$inject)得到需要注入的provider作为...

ESR 研发中心 196

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

AngularJS DI(依赖注入)实现推测

AngularJS DI(依赖注入) http://www.cnblogs.com/whitewolf/archive/2012/09/11/2680659.html   回到angularjs:在框架中为我们提供了angular.injector(modules)DI注入注射器。但是在我们使用注入的时候常常是不需要关心具体的如何注入。我们只需要按照其规则书写我们的angularjs代码就...

weixin_34392843的博客 175

ng-strict-di模式下的ng-annotate应用:提升AngularJS代码质量

在AngularJS开发中,依赖注入是核心机制之一,但手动管理依赖注解不仅繁琐,还容易在代码压缩时引发错误。**ng-annotate**作为一款强大的工具,能够自动为AngularJS代码添加、移除和重建依赖注入注解,完美适配**ng-strict-di**严格模式,帮助开发者提升代码质量与可维护性。 ## 为什么需要ng-strict-di模式? AngularJS的`ng-strict-

gitblog_00003的博客 717

angularjs DI简单模拟

简单模拟了一下angularjs的DI. 注入器,简单思路: 1 Injector容器供用户注入 2 监听onload事件,找到controller,然后执行对应方法 var Injector = (function(){ window.onload = compile; function compile()...

weixin_33859504的博客 86

JS,AngularJs中的DI。

DI是Angular的特色功能,而在Angular 2.0的计划中,DI将成为一个独立的模块,参见 https://github.com/angular/di.js 这意味着它也有机会被用于nodejs等技术中,其他前端框架也完全有机会使用它。 DI简介 对于后端程序员,特别是java、.NET程序员来说,DI是个无须解释的概念,但是对前端程序员则比较陌生,我只简单的说一下DI的概念,

Mr_chmer的专栏 1773

angularJS DI

DI详解 转载于:https://my.oschina.net/u/3354338/blog/858479

chunyongyin0596的博客 156

AngularJS入门之Services

关于AngularJS中的DI 在开始说AngularJS的Service之前,我们先来简单讲讲DI(Dependency Injection,通常中文称之为“依赖注入”)。 DI是一种软件设计模式,主要为了解决组件获取它的依赖组件的问题。DI的概念渗透在AngularJS的各个地方,AngularJS使用一个专门的子系统($injector)进行DI管理,这个过程包括了创建组件、解析

学如逆水行舟,不进则退 385

学习AngularJS有这一篇就好了

一、AngularJS简介   AngularJS 诞生于2009年,由Misko Hevery 等人创建,后为Google所收购。是一款优秀的前端JS框架,已经被用于Google的多款产品当中。AngularJS有着诸多特性,最为核心的是:MVC、模块化、自动化双向数据绑定、依赖注入等等。 二、AngularJS四大特征 2.1 MVC模式   Angular遵循软件工程的MVC模式,并鼓励展现,数据,和逻辑组件之间的松耦合.通过依赖注入(dependency injection),Angular.

qibulemingzi的博客 4156

FOC电流采样延迟补偿全解析:从延迟来源到相位裕度提升

在永磁同步电机控制中,FOC(磁场定向控制)是主流方案,而电流环的性能直接决定电机的高速稳定性和动态响应。实际系统里,ADC采样保持、转换时间、PWM更新一拍延迟以及前端RC滤波等因素,共同构成了微秒级的电流采样延迟。这些延迟在低速时几乎无感,但随着电频率升高,会在电流反馈通道引入显著的相位滞后,导致相位裕度下降,引发高频啸叫、电流环振荡等工程问题。延迟补偿的核心价值在于,通过硬件触发同步、角度旋转补偿、预测(无差拍)算法以及软件相位超前等策略,将反馈电流换算回真实时刻,从而恢复电流环带宽与稳定性。这类技术

weixin_34221073的博客 287
上一篇: 看看谁聪明,类游戏寻找算法
下一篇: centOS下解决java生成图片中文乱码问题
staffrobot
博客等级 码龄19年 6粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值