Я хотел бы знать, что считается лучшими практиками или шаблонами для отделения кода приложения от кода фреймворка, особенно в отношении OSGi.
Я собираюсь использовать пример со страниц Felix SCR
Пример службы - это Comparator
package sample.service;
import java.util.Comparator;
public class SampleComparator implements Comparator
{
public int compare( Object o1, Object o2 )
{
return o1.equals( o2 ) ? 0 : -1;
}
}
. Приведенный выше код не содержит инфраструктуры, это ' s сфокусированный и лаконичный. Чтобы сделать это доступным для приложения при использовании OSGi, необходимо зарегистрировать его в реестре служб. Один из способов, как описано на связанных страницах Felix, - это использование среды выполнения компонентов службы.
// OSGI-INF/sample.xml
и
Service-Component: OSGI-INF/sample.xml
Все хорошо и прекрасно, моя реализация службы вообще не связана с OSGI.
Теперь я хочу использовать служба ...
package sample.consumer;
import java.util.Comparator;
public class Consumer {
public void doCompare(Object o1, Object o2) {
Comparator c = ...;
}
}
Используя стратегию поиска SCR, мне нужно добавить методы только для фреймворка:
protected void activate(ComponentContext context) {
Comparator c = ( Comparator ) context.locateService( "sample.component" );
}
Используя стратегию событий SCR, мне также нужно добавить методы только для фреймворка:
protected void bindComparator(Comparator c) {
this.c = c;
}
protected void unbindComparator(Comparator c) {
this.c = null;
}
Ни один из них не является ужасно обременительным, хотя я думаю, что вероятно, вы получите изрядное количество этого типа кода, дублированного в классах, что делает его более шумным для фильтрации.
Одно из возможных решений, которое я вижу, - это использовать специальный класс OSGi для посредничества между потребителем, с помощью более традиционных средств и фреймворка.
package sample.internal;
public class OsgiDependencyInjector {
private Consumer consumer;
protected void bindComparator(Comparator c) {
this.consumer.setComparator(c);
}
protected void unbindComparator(Comparator c) {
this.consumer.setComparator(null);
}
}
Хотя я не уверен, как вы это разместите в конфигурации SCR.
Есть также аннотации org.apache.felix.scr., хотя это означает, что все это будет работать, только если вы строите с помощью maven-scr-plugin. На самом деле не так уж и плохо, и, AFAICT, они не накладывают никаких последствий на время выполнения.
Итак, теперь вы прочитали все это, что вы предлагаете, как лучший способ использования услуг, предоставляемых OSGi, без «загрязнения» кода приложения кодом инфраструктуры?