#osgi #osgi-bundle
#osgi #osgi-bundle
Вопрос:
Я рефакторинг существующих API OSGI. Существует переменная экземпляра (emailHandler), объявленная с ключевым словом ‘final’, которое инициализируется внутри конструктора. Для создания экземпляра экземпляра требуется служба OSGI, но я думаю, что конструктор вызывается до того, как произойдет привязка службы osgi, но нужная мне служба OSGI уже зарегистрирована другим пакетом. Есть ли способ получить эту службу OSGI?
Вот мой пример кода.
private final EmailHandler emailHandler;
private final DatabaseStorage databaseStorage;
private IEmailService emailService;
@Component(service = SampleOSGIService.class)
public SampleOSGIService() {
this.emailHandler = new EmailHandler(emailService);
this.databaseStorage = this.emailHandler.getDatabaseStorage();
}
@Reference
public void bindEmailService(IEmailService emailService) {
this.emailService = emailService;
}
Мне нужно получить службу OSGI ‘IEmailService’, чтобы инициализировать ’emailHandler’.
Или мне нужно удалить ключевое слово ‘final’ и создать экземпляр ’emailHandler’ и ‘databaseStorage’ вне конструктора после активации ‘SampleOSGIService’?
Ответ №1:
Если вы хотите использовать final
, вы можете использовать внедрение конструктора.
@Component
public class Foo {
final Bar bar;
public Foo( @Reference Bar bar ) {
this.bar = bar;
}
}
В любом случае, методы привязки следует использовать только в редких случаях. Вместо этого используйте ссылки на поля:
@Reference
Bar bar;
За последние несколько лет в OSGi многое произошло!
Комментарии:
1. Извините.. Кстати, ‘SampleOSGIService’ тоже является службой OSGI. таким образом, он не вызывается напрямую каким-либо классом из моих API.