热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

GoogleGuice之注入方式

在Guice中,注入方式有如下几种:一、构造器注入(ConstructorInjection)使用构造器注入只要在构造方法上添加一个@Inject注解,该构造方法接收一些依赖参数,

在Guice中,注入方式有如下几种:


一、构造器注入(Constructor Injection)

使用构造器注入只要在构造方法上添加一个@Inject注解,该构造方法接收一些依赖参数,大多数的构造方法将这些参数赋值给final字段。

public class RealBillingService implements BillingService {
private final CreditCardProcessor processorProvider;
private final TransactionLog transactionLogProvider;
@Inject
public RealBillingService(CreditCardProcessor processorProvider,
TransactionLog transactionLogProvider) {
this.processorProvider = processorProvider;
this.transactiOnLogProvider= transactionLogProvider;
}
}

如果有一个类没有添加了@Inject注解的构造方法,那么Guice使用一个public的、没有参数的构造方法,如果该构造方法存在的话。

构造器依赖易于单元测试,如果你类在一个唯一的构造方法中接收所有参数,这样你就不会忘记去设置依赖。当一个新的依赖产生了,所有的调用代码很容易修改,更正掉编译错误你就完事大吉了。


二、方法注入(Method Injection)

Guice可以通过冠以@Inject注解的访求进行注入。依赖采用参数的形式,在调用方法之前注入器会解析依赖。被注入方法可以有任意多的参数,并且方法名称不会影响注入。

public class PayPalCreditCardProcessor implements CreditCardProcessor {
private static final String DEFAULT_API_KEY = "development-use-only";
private String apiKey = DEFAULT_API_KEY;
@Inject
public void setApiKey(@Named("PayPal API key") String apiKey) {//该方法会被Guice调用并注入值
this.apiKey = apiKey;
}
}

三、字段注入(Field Injection)

Guice可以通过冠以@Inject注解的字段进行注入,这是最简洁的注入方式,但是却最不利于测试。示例:

public class DatabaseTransactionLogProvider implements Provider {
@Inject Connection connection;
public TransactionLog get() {
return new DatabaseTransactionLog(connection);
}
}

四、可选注入(Optional Injections)

有的时候需要一个依赖对象存在则进行注入,如果不存在则不进行注入,这样是比较方便的。方法与字段注入可以是可选的,这样当依赖对象不可用的时候Guice就会忽略这些注入。要使用可能的注入,使用@Inject(optiOnal=true)注解。

public class PayPalCreditCardProcessor implements CreditCardProcessor {
private static final String SANDBOX_API_KEY = "development-use-only";
private String apiKey = SANDBOX_API_KEY;
@Inject(optiOnal=true)
public void setApiKey(@Named("PayPal API key") String apiKey) {
this.apiKey = apiKey;
}
}

当可选注入与及时绑定混在一起时,你可能会得到一个让你意外的结果。例如,如下字段总是会进行注入即使Date对象没有显示地进行绑定。但是Date类有一个公开的无参数构造方法,这就符合及时绑定条件。

@Inject(optiOnal=true) Date launchDate;//launchDate依赖会进行注入

五、请求式注入(On-demand Injection)

方法与字段注入可以用于初始化实例对象,使用Injector.injectMembers

public static void main(String[] args) {
Injector injector = Guice.createInjector(...);
CreditCardProcessor creditCardProcessor = new PayPalCreditCardProcessor();//手动创建而不是从容器中获取
injector.injectMembers(creditCardProcessor);//会为creditCardProcessor中需要注入的成员进行注入
}

六、静态注入

当一个应用从静态工厂迁移到Guice上来时,静态注入就是一有效手段。在Module类中使用requestStaticInjection()方法,这样就可能对类中冠以@Inject注解的静态字段进行注入。

@Override public void configure() {
requestStaticInjection(ProcessorFactory.class);
...
}
class ProcessorFactory {
@Inject static Provider

processorProvider;
/**
* @deprecated prefer to inject your processor instead.
*/
@Deprecated
public static Processor getInstance() {
return processorProvider.get();
}
}

文档中说静态成员在使用实例注入(instance-injection)时无效,但经本人测试实例注正常,不论是静态成员还是实例成员。

但这个API已经不被建议使用,因为它存在很多静态工厂类似问题:难于测试,使依赖透明化,依赖于全局状态等。


七、自动注入(Automatic Injection)

以下情形Guice会进行自动注入:

a. 传递给toInstance()语句的实例

b. 传递toProvider()语句的Provider对象,这些对象会在注入器创建时进行注入

-------------------------------- END -------------------------------

及时获取更多精彩文章,请关注公众号《Java精讲》。


推荐阅读
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了Hyperledger Fabric外部链码构建与运行的相关知识,包括在Hyperledger Fabric 2.0版本之前链码构建和运行的困难性,外部构建模式的实现原理以及外部构建和运行API的使用方法。通过本文的介绍,读者可以了解到如何利用外部构建和运行的方式来实现链码的构建和运行,并且不再受限于特定的语言和部署环境。 ... [详细]
  • Imtryingtofigureoutawaytogeneratetorrentfilesfromabucket,usingtheAWSSDKforGo.我正 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了在go语言中利用(*interface{})(nil)传递参数类型的原理及应用。通过分析Martini框架中的injector类型的声明,解释了values映射表的作用以及parent Injector的含义。同时,讨论了该技术在实际开发中的应用场景。 ... [详细]
  • 阿,里,云,物,联网,net,core,客户端,czgl,aliiotclient, ... [详细]
  • ZSI.generate.Wsdl2PythonError: unsupported local simpleType restriction ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • r2dbc配置多数据源
    R2dbc配置多数据源问题根据官网配置r2dbc连接mysql多数据源所遇到的问题pom配置可以参考官网,不过我这样配置会报错我并没有这样配置将以下内容添加到pom.xml文件d ... [详细]
  • 集合的遍历方式及其局限性
    本文介绍了Java中集合的遍历方式,重点介绍了for-each语句的用法和优势。同时指出了for-each语句无法引用数组或集合的索引的局限性。通过示例代码展示了for-each语句的使用方法,并提供了改写为for语句版本的方法。 ... [详细]
  • MongoDB用户验证auth的权限设置及角色说明
    本文介绍了MongoDB用户验证auth的权限设置,包括readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase、cluster相关的权限以及root权限等角色的说明和使用方法。 ... [详细]
  • 本文介绍了OpenStack的逻辑概念以及其构成简介,包括了软件开源项目、基础设施资源管理平台、三大核心组件等内容。同时还介绍了Horizon(UI模块)等相关信息。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
author-avatar
Li修贤_594
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有