繁体   English   中英

来自 Quarkus (java) 的依赖注入

[英]Dependency injection from Quarkus (java)

同学们,你们好! 是否可以在通过“new”运算符创建的类中注入 bean? 例如:

public class TestClass implements Callback {
 
@Inject
TestClassRepository repository;

//just only methods...
}

'TestClass' 是从另一个类创建的:

Flyway.configure().collbacks(new TestClass()).load();

我对此有疑问,因为 TestClass 内部的“repository.anyMethods()”会创建“NullPointer”异常。 “TestClassRepository”标有“@ApplicationScoped”和“@Startup”注释。

最简单的方法是使用构造函数注入,这将使您能够在手动创建TestClass<\/code>时传递一个实例:

new TestClass(myTestClassRepository); // <- repository could e.g. have been injected into the calling class / ...
@Singleton
public class TestConfig {

  @javax.enterprise.inject.Produces
  public TestClass testClass() {
    return new TestClass();
  }
}

另一个用@ApplicationsScoped@Singleton注释的类:

@Inject
public void method(TestClass testClass) {
  Flyway.configure().collbacks(testClass).load();
  // your code
}

如果您自己调用构造函数 ( new TestClass() ) 创建对象,则 quarkus 不会操作该对象,也不会注入存储库。

不,您不能在使用 new 关键字实例化的类中注入 bean。 但是您仍然可以像这样找到解决方法:

@Dependent
public class BeanFactory {

  @Inject
  TestClassRepository repository

  @Produces
  public TestClass createTestClass() {
    return new TestClass(this.repository);
  }

您可以在此处找到更多详细信息: Quarkus 上下文和依赖注入

您还可以为不同的配置文件定义多个 bean,如下面的几行所述

这意味着您可以为您的测试创建一个存储库,并为 prod 或任何最适合您的情况的存储库创建一个。

此外,我认为注释“@Startup”不会向您的 TestClassRepository bean 添加任何内容。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM