在以下情况下如何使用 HK2 依赖注入?

How to use HK2 dependency injection in following case?

Class School,Teacher,Test属于同一个包,本身就是文件。正如我们在测试文件中看到的那样,我正在使用 new 来制作所有对象,但我想知道如何使用 HK2 来做同样的事情。我知道如何使用 guice 或 spring(通过使用配置文件或使用 xml 文件)但我不知道如何在 HK2 中进行 DI。我经历了这个 source 但即使从那里阅读后也无法做到。

public class School
{
   public Teacher t;
}
public class Teacher
{
   public void intro
   {
      System.out.println("I am Math Teacher");
   }

}
public class Test
{
   public static void main(String[] args)
   {
     School s = new School();
     s.t = new Teacher();
     s.t.intro();
   }
}

如能提供更多信息,如如何使用构造函数对 HK2 进行 DI 或 setter 等额外信息,将会有很大帮助。

开始使用 HK2 的最简单方法是使用 hk2-inhabitant-generator。 此插件将生成一个 META-INF/hk2-locator/default 文件,HK2 将在您调用

时使用该文件填充 ServiceLocator
ServiceLocatorUtilities.createAndPopulateServiceLocator();

文件中填充了注释为 @Service 的服务 类。只需将 hk2-inhabitant-generator 插件添加到您的 pom.xml

<plugin>
    <groupId>org.glassfish.hk2</groupId>
    <artifactId>hk2-inhabitant-generator</artifactId>
    <version>${hk2.version}</version>
    <executions>
        <execution>
            <goals>
                <goal>generate-inhabitants</goal>
            </goals>
        </execution>
    </executions>
</plugin>

和类

@Service
public class School {

    private final Teacher teacher;

    @Inject
    public School(Teacher teacher) {
        this.teacher = teacher;
    }
}

@Service
public class Teacher {

    private final String name;

    public Teacher(String name) {
        this.name = name;
    }

    public Teacher() {
        this(DEFAULT_NAME);
    }
}

然后您可以从ServiceLocator

获取服务
public static void main(String... args) {
    ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
    Teacher t = locator.getService(Teacher.class);
    System.out.println(t.getName());
}

完成项目

https://github.com/psamsotha/hk2-getting-started

更新:hk2-metadata-generator

repo 还包括一个分支 metadata-generator,它使用 hk2-metadata-generator 而不是 hk2-inhabitants-generator。两者之间的区别在于 metadata-generator 将在编译期间创建居民文件。它所需要的只是在编译期间位于类路径上。这可能使用起来更自然。您可以在 maven-compiler-plugin 配置中包含 hk2-metadata-generator

<plugin>
    <groupId>org.apache.maven.plugins</groupId>
    <artifactId>maven-compiler-plugin</artifactId>
    <version>3.8.1</version>
    <inherited>true</inherited>
    <configuration>
        <source>1.8</source>
        <target>1.8</target>
        <annotationProcessorPaths>
            <annotationProcessorPath>
                <groupId>org.glassfish.hk2</groupId>
                <artifactId>hk2-metadata-generator</artifactId>
                <version>${hk2.version}</version>
            </annotationProcessorPath>
        </annotationProcessorPaths>
    </configuration>
</plugin>

另见