Вы используете класс, расширяющий ExtendedObjectSupplier
, чтобы обеспечить реализацию аннотации квалификатора для внедрения. Итак, если ваша аннотация @MyService
, вы можете сделать:
@Inject @MyService
MyService [] services;
Класс поставщика расширенных объектов отвечает за поиск значений, которые необходимо внедрить. Таким образом, вы можете использовать ServiceTracker
в поставщике.
Подробнее об использовании ExtendedObjectSupplier
здесь
Обновить сводку по использованию ExtendedObjectSupplier
Создайте свою аннотацию:
@Qualifier
@Documented
@Target({ElementType.PARAMETER, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MyService {
}
Создайте определение службы OSGi для поставщика, используя «Определение нового компонента».
<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0" name="greg.music.core.preferenceSettings">
<implementation class="package.MyServiceObjectSupplier"/>
<property name="dependency.injection.annotation" type="String" value="package.MyService"/>
<service>
<provide interface="org.eclipse.e4.core.di.suppliers.ExtendedObjectSupplier"/>
</service>
</scr:component>
MANIFEST.MF должен иметь ссылку на этот файл в Service-Component
Класс поставщика выглядит так:
public class MyServiceObjectSupplier extends ExtendedObjectSupplier
{
@Override
public Object get(final IObjectDescriptor descriptor, final IRequestor requestor, final boolean track, final boolean group)
{
// TODO return the object to inject
}
}
person
greg-449
schedule
17.06.2014