Я пытаюсь изучить HK2 для использования шаблона локатора сервисов. Ниже приведен код, который я написал:HK2 с использованием @Named для внедрения реализаций не работает
package org.swx.nursing.ccquerytool.file;
import org.jvnet.hk2.annotations.Contract;
@Contract
public interface FileReader {
public void test();
}
Вышеупомянутый интерфейс. Следующие 2 тестовые реализации следующие: package org.swx.nursing.ccquerytool.file;
import javax.inject.Singleton;
import org.jvnet.hk2.annotations.Service;
@Service (name="org.swx.nursing.ccquerytool.file.OcxReaderImpl")
@Singleton
class OcxReaderImpl implements FileReader{
public void test() {
// TODO Auto-generated method stub
System.out.println("OCX HelloWorld!!!!"+ ", ");
}
}
И следующее это второе реализация: пакет org.swx.nursing.ccquerytool.file;
import javax.inject.Singleton;
import org.jvnet.hk2.annotations.Service;
@Service (name="org.swx.nursing.ccquerytool.file.RarReaderImpl")
@Singleton
class RarReaderImpl implements FileReader{
public void test() {
// TODO Auto-generated method stub
System.out.println("RAR HelloWorld!!!!"+ ", ");
}
}
И следующий класс с основной() метод, чтобы проверить это:
package org.swx.nursing.ccquerytool.file;
import javax.inject.Inject;
import javax.inject.Named;
import org.glassfish.hk2.api.ServiceLocator;
import org.glassfish.hk2.utilities.ServiceLocatorUtilities;
public class Hk2Test {
private static ServiceLocator SERVICELOCATOR = ServiceLocatorUtilities.createAndPopulateServiceLocator();
@Inject @Named ("org.swx.nursing.ccquerytool.file.OcxReaderImpl")
public static FileReader fr =SERVICELOCATOR.getService(FileReader.class);
@Inject @Named ("org.swx.nursing.ccquerytool.file.RarReaderImpl")
public static FileReader fr2 =SERVICELOCATOR.getService(FileReader.class);
public static void main(String argv[]) {
//FileReader ocxReaderService = SERVICELOCATOR.getService(FileReader.class);
//ocxReaderService.test();
fr.test();
fr2.test();
}
}
Когда я запускаю это, следующий вывод:
OCX HelloWorld!!!!,
OCX HelloWorld!!!!,
, где я ожидал
OCX HelloWorld!!!!,
RAR HelloWorld!!!!,
Просьба сообщить, что я делаю неправильно здесь. Благодаря!
Используйте [ 'GetService (FileReader.class, имя);'] (https://hk2.java.net/hk2-api/apidocs/org/glassfish/hk2/api/ServiceLocator.html#getService % 28java.lang.Class,% 20java.lang.String,% 20java.lang.annotation.Annotation ...% 29). Ваш класс 'Hk2Test' не управляется. Инъекции не работают. В любом случае вы создаете его сами, победив цель инъекции –
, которую я изменил, чтобы использовать getService (FileReader.class, name), но получил тот же результат. Не могли бы вы подробнее рассказать о «неконтролируемой» части ее? – Rookie
Жаль, что у меня не было возможности проверить. Но вам может понадобиться использовать аннотацию '@Named (" ... ")'. Кажется, что «имя» в сервисе не работает для этого. Кроме того, управляемый, я имею в виду, что он не управляется контейнером DI. Вы управляете другими классами, поскольку они аннотируются с помощью '@ Service'. Я не думаю, что просто аннотация для класса «Hk2Test» будет работать в этом случае. Не уверен, причина, может быть статическая проблема, проблема основного класса, кто знает. Но создайте еще один класс обслуживания и попробуйте ввести его там (не создавайте экземпляр, просто объявляйте), и инъекция должна работать –