Доступ к сервисным фабрикам с фабрики компонентов в ОСГИ
Я использую фабрику компонентов для создания нескольких уникальных экземпляров, которые, в свою очередь, используют сервисы, которые являются сервисными фабриками для создания нескольких экземпляров. Моя структура выглядит как TInterface - интерфейс / сервис TInterfaceInline - который реализует TInterface и состоит из @Reference для другого сервиса.
Tinterfaceimpl1 - расширяет TInterfaceInline, который является служебным компонентом со свойством filter.
TConsumer - фабрика компонентов, которая использует TInterfaceInline, получая его в @Reference.
TConsumer
@Component(name = "TConsumer", factory = "TConsumer")
@Service
public class TConsumer implements IConsumer {
// @Reference(bind = "bindInterface1", unbind = "unbindInterface1", target =
// "(className=Interface)")
// private Tinterface interface1;
@Reference(referenceInterface = ParentProfile.class, bind = "bindInterface11", unbind = "unbindInterface11", target = "(className=interface1)", policy = ReferencePolicy.STATIC, cardinality = ReferenceCardinality.MANDATORY_UNARY)
private ParentProfile interface11;
@Activate
public void activate(BundleContext aBundleContext) {
System.out.println("Object = " + interface11);
}
protected void bindInterface11(ParentProfile interface11) {
this.interface11 = interface11;
System.out.println("ref object11 created");
}
protected void unbindInterface11(ParentProfile interface11) {
interface11 = null;
}
TinterfaceImpl
@Component(name = "TInterfaceImol")
@Service(serviceFactory = true,value=ParentProfile.class)
@Properties(value = { @Property(name = "className", value = "interface1") })
public class Tinterfaceimpl1 extends TinterfaceInline {
public Tinterfaceimpl1() {
System.out.println("Generalprofile class : " + this);
}
}
TinterfaceInline
@Component(name = "TinterfaceInline ")
@Service
public class TinterfaceInline implements java.io.Serializable, ParentProfile {
// @Reference(bind = "bindtestin", unbind = "unbindtestin", cardinality =
// ReferenceCardinality.MANDATORY_UNARY, policy = ReferencePolicy.STATIC)
public Testint testin;
protected synchronized void bindtestin(Testint inter) {
this.testin = inter;
System.out.println("Profile Class : binded parameterresolver " + testin);
}
protected synchronized void unbindtestin(Testint inter) {
this.testin = inter;
}
}
ParentClass
@Component(name = "PResolver")
@Service
public class ProfileClass implements Testint {
public ProfileImpl() {
System.out.println("Parameter class impl : which extends ");
}
}
Помимо этого остальными вещами являются маркерные интерфейсы. Если я пытаюсь установить в karaf, состояние Tinterfaceimpl1 будет зарегистрировано. то есть) я использую фабрики обслуживания и получаю доступ к фабрикам обслуживания от фабрики компонентов. Класс Servicefactory расширяет класс, который реализует интерфейс. Что является причиной Tinterfaceimpl1 является зарегистрированным.