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

singleton注入java_java–GuiceSingleton静态注入模式

你错误地考虑了依赖注入.依赖注入和服务定位器是彼此的镜像:使用服务定位器,您可以询问它是否为对象.使用依赖注入,你不会去寻找依赖,它们只是交给你.基本上,“它一直是乌

你错误地考虑了依赖注入.依赖注入和服务定位器是彼此的镜像:使用服务定位器,您可以询问它是否为对象.使用依赖注入,你不会去寻找依赖,它们只是交给你.

基本上,“它一直是乌龟”!应该注入你班级的每一个依赖.如果MyApplication需要MyConfiguration对象,它应该只接受MyConfiguration对象作为构造函数参数,而不用担心它是如何构造的.

现在,这并不是说您永远不能手动使用new – 但是您应该为没有外部依赖性的值类型对象保留它. (在这种情况下,我认为你通常使用静态工厂方法而不是公共构造函数更好,但这不是重点.)

现在有几种方法可以做到这一点.一种方法是将MyConfiguration分成许多小块,这样你就可以执行@Inject @Configuration(“x”)String或类似的东西,而不是做myConfiguration.getConfig(“x”).或者,您可以使MyConfiguration本身可注入,然后为其提供访问器方法.正确的答案在某种程度上取决于您尝试建模的数据类型 – 使依赖关系过于精细化,并且您的绑定可能难以维护(尽管有方法可以使其更好);使依赖关系过于粗糙,你会让它更难测试(例如:哪个更容易,只提供你正在测试的类所需的“x”配置,或构建整个应用程序的配置?).

你甚至可以做到这两点:

/** Annotates a configuration value. */

@BindingAnnotation

@Retention(RetentionPolicy.RUNTIME)

public @interface Config {

String value();

}

/** Installs bindings for {@link MyConfiguration}. */

final class MyConfigurationModule extends AbstractModule {

@Override protected void configure() {}

@Provides

@Singleton

MyConfiguration provideMyConfiguration() {

// read MyConfiguration from disk or somewhere

}

@Provides

@Config("x")

String provideX(MyConfiguration config) {

return config.getConfig("x").getName();

}

}

// elsewhere:

/** The main application. */

final class MyApplication {

private final String xConfig;

@Inject MyApplication(@Config("x") String xConfig) {

this.xConfig = xConfig;

}

// ...

}

您可以在单元测试中采用类似的方法:

/** Tests for {@link MyApplication}. */

@RunWith(JUnit4.class)

public final class MyApplicationTest {

// Note that we don't need to construct a full MyConfiguration object here

// since we're providing our own binding, not using MyConfigurationModule.

// Instead, we just bind the pieces that we need for this test.

@Bind @Config("x") String xConfig = "x-configuration-for-test";

@Before public void setUp() {

// See https://github.com/google/guice/wiki/BoundFields

Guice.createInjector(BoundFieldModule.of(this)).injectMembers(this);

}

@Inject MyApplication app;

@Test public void testMyApp() {

// test app here

}

}

依赖注入还鼓励我强烈推荐的另一种最佳实践,即设计类型系统,使无效状态不可表示(尽可能最大程度).如果MyApplication所需的所有配置都在其构造函数中传递,则不可能有一个没有有效配置的MyApplication对象.这允许您“前加载”类不变量,这使得更容易推理对象的行为.

最后,关于Injector.getInstance()的注释.理想情况下,您只需在程序中使用一次Injector:在构建之后立即使用Injector.也就是说,您应该能够执行Guice.createInjector(…).getInstance(MyApplication.class).start()并且永远不会在任何地方存储对Injector的引用.我倾向于使用Guava的ServiceManager抽象构建应用程序(参见this question),所以我唯一需要做的就是:

public static void main(String[] args) throws Exception {

Injector injector = Guice.createInjector(...);

ServiceManager manager = injector.getInstance(ServiceManager.class);

manager.startAsync().awaitHealthy();

}



推荐阅读
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • Java自带的观察者模式及实现方法详解
    本文介绍了Java自带的观察者模式,包括Observer和Observable对象的定义和使用方法。通过添加观察者和设置内部标志位,当被观察者中的事件发生变化时,通知观察者对象并执行相应的操作。实现观察者模式非常简单,只需继承Observable类和实现Observer接口即可。详情请参考Java官方api文档。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • JavaSE笔试题-接口、抽象类、多态等问题解答
    本文解答了JavaSE笔试题中关于接口、抽象类、多态等问题。包括Math类的取整数方法、接口是否可继承、抽象类是否可实现接口、抽象类是否可继承具体类、抽象类中是否可以有静态main方法等问题。同时介绍了面向对象的特征,以及Java中实现多态的机制。 ... [详细]
  • 本文介绍了UVALive6575题目Odd and Even Zeroes的解法,使用了数位dp和找规律的方法。阶乘的定义和性质被介绍,并给出了一些例子。其中,部分阶乘的尾零个数为奇数,部分为偶数。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Java中包装类的设计原因以及操作方法
    本文主要介绍了Java中设计包装类的原因以及操作方法。在Java中,除了对象类型,还有八大基本类型,为了将基本类型转换成对象,Java引入了包装类。文章通过介绍包装类的定义和实现,解答了为什么需要包装类的问题,并提供了简单易用的操作方法。通过本文的学习,读者可以更好地理解和应用Java中的包装类。 ... [详细]
  • 先看官方文档TheJavaTutorialshavebeenwrittenforJDK8.Examplesandpracticesdescribedinthispagedontta ... [详细]
  • Android系统源码分析Zygote和SystemServer启动过程详解
    本文详细解析了Android系统源码中Zygote和SystemServer的启动过程。首先介绍了系统framework层启动的内容,帮助理解四大组件的启动和管理过程。接着介绍了AMS、PMS等系统服务的作用和调用方式。然后详细分析了Zygote的启动过程,解释了Zygote在Android启动过程中的决定作用。最后通过时序图展示了整个过程。 ... [详细]
  • 本文介绍了Java中Hashtable的clear()方法,该方法用于清除和移除指定Hashtable中的所有键。通过示例程序演示了clear()方法的使用。 ... [详细]
  • 重入锁(ReentrantLock)学习及实现原理
    本文介绍了重入锁(ReentrantLock)的学习及实现原理。在学习synchronized的基础上,重入锁提供了更多的灵活性和功能。文章详细介绍了重入锁的特性、使用方法和实现原理,并提供了类图和测试代码供读者参考。重入锁支持重入和公平与非公平两种实现方式,通过对比和分析,读者可以更好地理解和应用重入锁。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文讨论了使用差分约束系统求解House Man跳跃问题的思路与方法。给定一组不同高度,要求从最低点跳跃到最高点,每次跳跃的距离不超过D,并且不能改变给定的顺序。通过建立差分约束系统,将问题转化为图的建立和查询距离的问题。文章详细介绍了建立约束条件的方法,并使用SPFA算法判环并输出结果。同时还讨论了建边方向和跳跃顺序的关系。 ... [详细]
author-avatar
午夜呻吟的诱惑
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有