Как ServiceLocator автоматически находит @Service и @Contact в HK2?
По словам HK2 @Service Javadoc
Аннотация помещается в классы, которые должны автоматически добавляться в hk2 ServiceLocator.
Я не знаю как сделать ServiceLocator
найти аннотированные классы автоматически.
TestService
@Contract
public interface TestService {
}
TestServiceImpl
@Service
public class TestServiceImpl implements TestService {
}
Главный
public static void main(String[] args) {
ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
TestService service = locator.getService(TestServiceImpl.class);
System.out.println(service); // null
}
Результат всегда null
, Я должен добавить Descriptor
Итак ServiceLocator
могу найти это.
public static void main(String[] args) {
ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator();
DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class);
DynamicConfiguration config = dcs.createDynamicConfiguration();
config.bind(BuilderHelper.link(TestServiceImpl.class).to(TestService.class).in(Singleton.class).build());
config.commit();
TestService service = locator.getService(TestServiceImpl.class);
System.out.println(service); // TestServiceImpl instance
}
Как я могу позволить ServiceLocator
найти аннотированные классы автоматически? Я что-то не так понял?
2 ответа
Вам нужно запустить hk2-identant-generator над вашими встроенными классами, чтобы получить автоматическое обнаружение сервисов. Здесь также больше информации.
Этот шаг в процессе сборки заключается в создании файла с именем META-INF/hk2-locator/default с информацией об услугах. Затем вызов createAndPopulateServiceLocator считывает эти файлы и автоматически добавляет эти дескрипторы службы в возвращенный ServiceLocator.
К вашему сведению, я был так расстроен, что полагался на обычные файлы, а не на возможность сканирования аннотированных классов во время выполнения, я написал этот проект:
https://github.com/VA-CTT/HK2Utilities
Поскольку генераторы времени выполнения Eclipse / Maven / местный житель не будут играть хорошо, было почти невозможно отладить код, который использовал HK2 в затмении, без сканирования во время выполнения.
Пакет HK2Utilities доступен в центре:
<dependency>
<groupId>gov.va.oia</groupId>
<artifactId>HK2Utilities</artifactId>
<version>1.4.1</version>
</dependency>
Чтобы использовать это, вы просто позвоните:
ServiceLocator locator = HK2RuntimeInitializer.init("myName", false, new String[]{"my.package.one", "my.package.two"});
Это отсканирует путь к классам во время выполнения для поиска классов в перечисленных пакетах и автоматически заполнит их локатором службы.
С этой моделью вам никогда не нужно генерировать обычные файлы - и на практике я обнаружил, что она быстрее, чем обычный программный код (не то, что производительность имеет большое значение для этой одноразовой операции)
Что ж, теперь (2.6.1) все, что вам нужно сделать, это добавить зависимости - javax.inject, hk2-utils, hk2-api и hk2-metadata-generator.
Когда вы создаете проект, компилятор javac сгенерирует файл по умолчанию в META-INF, содержащий следующие соединения:
[service-class-name]S
contract={contract-class-name}
Это будет зарегистрировано ServiceLocator во время выполнения. Этого должно быть достаточно. Однако, если это не сработает, есть другие варианты,
плагин mvn
org.glassfish.hk2 hk2-житель-генератор 2.5.0-b36 сгенерировать-жителей
инструмент линии cmd
java org.jvnet.hk2.generator.HabitatGenerator [--file jarFileOrDirectory] [--outjar jarFile] [--locator locatorName] [--verbose]
Подробнее об этом https://javaee.github.io/hk2/inhabitant-generator.html