Как 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

Другие вопросы по тегам