所以我正在我的Java项目(Google Guice)中实现一个依赖注入框架,一切都很好,我喜欢它,但是有一个小问题;我想为我的主项目的类创建一个静态实例(实例化依赖项等)。但是我不知道使用Guice实例化它的任何方法,我不能手动实例化它,因为我在它的构造函数中使用DI(我在构造函数中有对象),这意味着我不能访问实例化该类所需的类的非静态变量。我试着使用一个提供者,但是我真的不明白在哪里绑定它,因为我不想有一个主类的接口(如果需要的话就要)。
根据问题的不同,你可以在这里得到三个不同的答案。
若要直接回答标题中的问题(构造函数中的参数为 DI),可以通过注入 Factory 将 DI 与构造器参数混合。虽然欢迎您手动编写一个,但Guice可以作为辅助注入为您执行此操作(请参阅FactoryModuleBuilder),或者您可以使用通过Dagger流行的等效代码生成解决方案AutoFactory。
如果您尝试在Guice应用程序中初始化静态类的字段,Guice可以在Injector创建后立即为您执行此操作。只需在您提供给Guice的模块中调用请求静态注入。正如Andy Turner所指出的,这将导致您错过Guice的一些好处:因为您是静态注入实例,所以您几乎没有机会在测试或其他类重用中提供替换实现。Guice在其wiki的静态注入部分对此进行了更多描述:
将应用程序从静态工厂迁移到 Guice 时,可以增量更改。静态注入在这里是一个有用的拐杖。它使对象可以部分参与依赖关系注入,方法是在不注入自身的情况下访问注入的类型。[...]
静态成员不会在实例注入时注入。不建议将此 API 用于常规用途,因为它会遇到许多与静态工厂相同的问题:测试起来很笨拙,它使依赖项不透明,并且它依赖于全局状态。
最好的整体解决方案是Andy的答案:调整应用程序以使用DI,这将使它注入否则将成为静态的对象。
如果您想将一个类的静态实例与依赖注入混合在一起,您可能已经错过了依赖注入的要点:您可以简单地注入类的实例。
如果您希望您的注入器有一个类实例,请在< code>@Singleton范围内绑定它:
bind(YourClass.class).in(Singleton.class);
在模块的configure()
方法中,或
@Provides @Singleton YourClass provideYourClassInstance() {
// ...
}
在模块中,或
@Singleton class YourClass {
// ...
}
在实际的类声明中。
然后像注入其他实例一样注入这个实例:
class SomeOtherClass {
@Inject SomeOtherClass(YourClass instance) {
// ... Do something with instance, like assign it to a field.
}
}
关键是 SomeOtherClass
不需要知道任何关于实例生存期的信息:这是否是一个单例实例,或者使用它的每个类都有自己的实例
并不重要。
图 6.1 time1.cpp 中的构造函数将 hour、minute 和 second 初始化为 0(即军用时间午夜11时)。 构造函数可以包含默认参数。图 6.8 重新定义 Time 的构造函数,该函数中每个变量的默认参数为0。通过提供构造函数默认参数,即使在构造函数调用中不提供数值,对象也能利用默认参数初始化为一致状态。程序员提供所有参数默认值(或显式不要求参数)的构造函数也称为默认构造函数
鉴于 IntelliJ IDEA 2016.1.1报告“可以替换为方法引用”。 我知道无参数构造函数的< code>Foo::new语法,但是不知道如何将< code>foo作为参数传入。我肯定漏掉了什么。
问题内容: 我想为MySortedSet调用一个构造函数,该构造函数将Comparator c作为参数。我该如何修改呢? 问题答案: 如果要传递其他捕获的值作为参数,则不能使用方法引用。您将不得不使用lambda表达式来代替: =>
问题内容: 我的课如下: 在构造函数中的逻辑和是我试图嘲弄的事情。我想要任何调用:返回一个虚拟字符串。 我试过了: 但这似乎不起作用。仍在执行构造函数逻辑,而不是获取的模拟对象。 问题答案: 您发布的代码适用于最新版本的Mockito和Powermockito。也许您还没有准备A?试试这个: A.java MockA.java 两项测试均应通过Mockito 1.9.0,powermockito
问题内容: 如果我有一个像这样的构造函数: 然后,我如何在与构造函数相同的类中的方法中使用变量c和d,因为尝试仅在方法中使用变量名似乎不起作用? 问题答案: 实际上,您的代码将无法编译- 无效。 我认为您的意思是:- 。 然后我如何在与构造函数相同的类中的方法中使用变量c和d 您不能这样做,因为您已将它们声明为局部变量,其范围在构造函数结束执行时终止。 您应该将它们声明为实例变量。
我正试图编写一个简单的CRUD程序,我得到了这个错误。这个项目是基于我的项目。不知道我为什么不工作。 如果我注释掉构造函数,错误就会消失。我的房子里什么都没有。 有人能帮我一把吗? 这是我的代码: 实体/食品。JAVA 仓库/FoodRepository.java 控制器/食物控制器。JAVA 主课 波姆。xml