启动
Injector创建过程概况
Guice使用配置module创建Injector。如果任意一个阶段出现错误,Injector都会停止创建,并抛出CreationException。
第一阶段:静态构建
Guice解析绑定配置,创建对象,校验配置文件。在这个阶段唯一执行的用户代码是Module.configure()。
这阶段只存在于配置为Stage.TOOL。
第二阶段:注入
在这个阶段,如果有必要,对象会被按方法需要注入。例如,静态注入需要一个Provider实例,那么使用前会完成Provider的注入。如果初始化的对象存在环依赖,则不限定注入顺序。
首先,注入通过requestStaticInjection()的静态注册的类。然后,注入requestInjection()、toInstance()、toProvider()方法参数实例。
第三阶段:预加载单例
如果配置Stage.PRODUCTION,全部单例都会被创建。如果配置Stage.DEVELOPMENT,只有使用asEagerSingleton()配置的绑定会被创建。
绑定原理
Injector是如何解决注入的
Injectory是通过绑定配置module与相关注解实现对象的注入。下面介绍如何解决注入:
1、使用精确绑定
如果绑定配置连接的是另一个配置,则依据另一个绑定算法。
如果配置了一个实例,则返回这个实例。
如果配置指定一个提供者,则返回提供者的实例。
2、询问父Injector
如果Injector存在一个父Injector,则请求父Injector解析绑定关系。如果这样成功,则返回这个实例,否则,继续处理。
3、询问子Injectors
如果任何子Injector已经存在这个绑定,则停止。父Injector会保存一份子Injectors的绑定对象黑名单,而不会保存子Injector的引用。
4、处理Prvoider接口注入
如果类型为Provider<T>,则解析T。如果存在注解,则使用相同的注解。
5、转换常量
如果一个常量字符串使用了相同的注解,并且TypeConverter支持这种类型,则使用已转换的字符串。
6、如果依赖存在一个绑定注解,则停止。
Guice不会为带注解绑定配置创建默认绑定。
7、如果依赖是数组或枚举,则停止。
8、TypeLiteral注入
如果依赖的类型为TypeLiteral<T>,则使用参数中的类型注入值。
9、使用注解
如果依赖带@ImplementBy或@ProviderBy注解,查找并使用引用类型的配置。
10、如果依赖是抽象类或非静态内部类,则停止。
11、带有@Inject或无参数的构建方法
校验全部依赖的类型及父类型:构建方法参数、带有@Inject注解的方法和成员变量
调用构造方法
注入全部对象。先注入父类,再注入子类。
注入全部方法。同上。
注入点
Guice是如何决定注入什么
构造方法注入
当Guice通过构造方法实例化一个类型时,它通过如下规则决定调用哪个构造方法:
1、查找带有@Inject注解的构造方法
如果全部构造方法的注解都是@Inject(optional=true),则返回异常。
如果存在多个带有@Inject的构造方法,则返回异常。
如果构造方法带带有绑定对象的注解(如@Named),则返回异常。
2、查找无参数的构造方法
如果构造方法为private类型,但类不是private,则返回异常。在非私有类中,不带@Inject的私有构造方法是不能被注入的。
如果构造方法带带有绑定对象的注解(如@Named),则返回异常。
3、没有找到合适的构造方法,则返回异常。
注入成员变量及方法
Guice按照一个特定顺序注入。先注入成员变量,然后是方法。对于成员变量,先注入父类再注入子类。方法类似。
注入什么?
1、全部使用toInstance()绑定的值。在Injector创建时候注入。
2、全部使用toProvider(Provider)绑定的Provider。在Injector创建时候注入。
3、全部注册使用requestInjection注入的实例。在Injector创建时候注入。
4、当方法调用时,Injector.injectMember的参数。
5、全部Guice通过可注入构造方法创建的值,在初始化后立即注入。无论scope是什么值,都只注入一次。
Guice注入静态方法和成员变量:
全部通过requestStaticInject注册静态注入的类。
如何注入?
注入成员变量:
1、查找配置,按需要创建绑定对象。如果绑定配置不存在,则报错。
2、通过Provider获取绑定对象。Provider如何工作依赖于客户实现。
3、直接将配置值赋给成员变量。不推荐注入final成员,因为注入的值有可能不被其它线程看到。如果成员变量带@Inject(optional=true)、绑定配置不存在且不能被创建,则略过成员变量的注入。
注入方法:
1、查找绑定配置,按需要创建对象。如果配置不存在,则报错。
2、通过Provider获取绑定对象。Provider如何工作依赖于客户实现。
3、使用绑定配置的值作为参数调用方法。如果方法注入是可选的,并且参数配置不存在且不能创建实例,则略过方法注入。
参考:https://github.com/google/guice/wiki/Bootstrap
相关推荐
草莓叶片病虫害数据集、包含了草莓叶片的病虫害图片和正常的叶片图片
Labview压装机程序源码:经典框架搭配研华数据采集卡,实现高效数据存储与条形码追溯,工控人员必备参考捷径,Labview项目经典压装机程序源码,经典框架,研华数据采集卡,m y s Q L存储数据,条形码追溯,是工控人员参考直接用的好捷径 ,Labview项目; 经典压装机程序; 经典框架; 研华数据采集卡; mySQl存储数据; 条形码追溯; 工控人员参考; 捷径,Labview经典压装机程序源码:研华数据采集卡支持,m y s Q L存储,条码追溯助力工控优化
无线数据收发系统毕业论文资料
遗传算法优化BP神经网络预测:提高预测精度,超越单一神经网络性能,遗传算法优化BP神经网络做预测,通过对比可以看出预测精度比单一BP神经网络要高很多 ,遗传算法优化BP神经网络; 预测精度; 对比; 单一BP神经网络; 优化提升。,"遗传算法优化BP神经网络预测,提升精度超越单一模型"
2025最新空调与制冷作业(运行操作)考试题及答案.docx
单片机设计程序例资料
AutoUpgrader+Pro+5.0.2+for+Delphi+2010+SOURCE+CODE.rar 源代码
无线遥控设计资料
基于STM32单片机的北斗GPS定位与蓝牙通信实现:上位机实时显示位置信息,stm32单片机 北斗GPS 定位 vb上位机显示。 蓝牙主从级通信。 主单片机获取GPS北斗模块定位信息后,通过蓝牙发送给从模块。 从蓝牙模块,从模块通过串口讲定位信息发送给vb上位机。 上位机实时显示位置信息。 基本接线信息,相关原理已经包含在资料内。 ,stm32单片机; 北斗GPS定位; 蓝牙主从通信; 串口通信; 上位机显示。,基于STM32的北斗GPS定位系统:蓝牙主从通信与VB上位机显示
基于AVR及无线收发模块的脉搏监测系统设计论文资料
基于USB接口的温度控制器设计资料
BC5_keygen.zip
基于FPGA的DS18B20多功能温度显示系统:实时更新数码管显示,按键查看历史温度与存储功能,超温报警提醒,基于FPGA的 DS18B20多功能温度显示 实现功能: 1.实时温度显示在数码管上,更新速率1-2s一次 2.按下按键显示最近30s内的最高温和最低温 不包含板子, 3.按下按键可以存储当前温度,最多存5个 4.超过温度报警 ,核心关键词:FPGA; DS18B20; 实时温度显示; 更新速率; 按键; 最高温最低温显示; 存储当前温度; 温度报警。,基于FPGA的DS18B20多功能温度显示系统:实时监测与报警存储控制
TMS320F28035和F28335系列DSP Bootloader:CAN、UART、SPI与TCP在线升级程序定制开发服务及上位机配套支持,DSP28035 Bootloader CAN在线升级程序DSP Bootloader TMS320F28035、TMS320F28335 UART、SPI、TCP、CAN在线升级程序,提供Bootloader定制开发服务。 提供:通讯协议,Hex文件解析,底层和应用层CMD文件分配等。 可配套上位机也可定制CAN程序下载器。 F28035的CAN在线升级程序 一个。 ,核心关键词:DSP28035 Bootloader; CAN在线升级程序; TMS320F28035; TMS320F28335; UART; SPI; TCP; CAN在线升级; 通讯协议; Hex文件解析; 底层和应用层CMD文件分配; 上位机定制CAN程序下载器。,基于DSP28035和F28035的CAN在线升级Bootloader程序定制服务
普乐特空压机远程控制程序:西门子PLC通讯,RS485连接,中控室操作,便捷安全控制,空压机控制程序(普乐特) 空压机远程控制 1.通过西门子200smart PLC通讯两台普乐特空压机; 2.MAM880系列(含MAM-KY系列,MAM-220系列)空压机都可以用; 3.通过RS485通讯,每台空压机只需要引一根2芯屏蔽线; 4.可以中控室(远程)看空压机各项参数,和操作启停空压机,无需到现场操作,更直接, 方便,安全; 5.PLC为西门子200Smart最小点数就可以,触摸屏昆仑通态TPC7062TI系列; 6.不需要多余线连接,完全RS485通讯 ,核心关键词:空压机控制程序; 普乐特空压机; 远程控制; 西门子200smart PLC; RS485通讯; MAM880系列空压机; 昆仑通态TPC7062TI触摸屏。,"西门子PLC通讯:普乐特空压机远程控制程序,便捷管理全系列MAM空压机"
PC红外线遥控器上位机及电路图
欧姆龙与发那科机器人通信程序:EIP21与FANUC Ethernet IP功能块配置详解——实现高效实时通信与数据批量修改,欧姆龙 发那科 机器人 通信程序 CP1H EIP21 与FANUC通信 Ethernet IP 已经做在功能块里,配置一下起始值结束值,节点就能连接成功。 例如连接了R1至R5在PLC中D1至D5 数值可以在机器人改也可以在PLC改,可以一个一个改也可以批量改。 本功能块逻辑严密,使用栈堆优先通信,实时性高。 ,欧姆龙; 发那科机器人; 通信程序; Ethernet IP通信; 功能块配置; 起始值结束值; 节点连接; PLC与机器人通信; 栈堆优先通信; 实时性。,欧姆龙与发那科机器人Ethernet IP通信程序:功能块配置与实时性优化
华为海思HI 3559A:超强算力赋能整机解决方案,一站式智能科技引领未来,华为海思HI 3559A 超强算力,整机解决方案 华为海思HI 3559A 超强算力,整机解决方案。 ,核心关键词:华为海思HI 3559A; 超强算力; 整机解决方案,"华为海思HI 3559A整机解决方案:超强算力引领未来技术革新"
关于单端反激变换器的变压器设计
FM调制器(三知杯)