在以下情况下如何使用 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>
另见
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>