Dependency Manager - Singleton Component

Components are the main building blocks for OSGi applications. They can publish themselves as a service, and they can have dependencies. These dependencies will influence their life cycle as component will only be activated when all required dependencies are available.

Example usage

To define a singleton component, you can use the DependencyActivatorBase.createComponent() or the DependencyManager.createComponent() method, like in the following example which defines a "TranslationService" osgi service having one required dependency on the "LocalizationService" and one optional dependency on a "LogService". Dependencies are optional by default, unless you invoke the ServiceDependency.setRequired(boolean) method:

 public class GoogleBasedTranslationService implements TranslationService {
     volatile LocalizationService m_localizationService; // injected by reflection
     volatile LogService m_log;
    ...
}
public class Activator extends DependencyActivatorBase {
    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
        Component c = createComponent()
           .setInterface(TranslationService.class.getName(), null)
           .setImplementation(GoogleBasedTranslationService.class)
           .add(createServiceDependency()
              .setService(LocalizationService.class, "(language=en)")
              .setRequired(true))
           .add(createServiceDependency()
              .setService(LogService.class)
              .setRequired(false)));
        dm.add(c);
   }
}

You can also inject dependencies using callbacks:

public class GoogleBasedTranslationService implements TranslationService {
    volatile LocalizationService m_localizationService; // injected by reflection
    void bind(LogService log {...}
    ...
}

public class Activator extends DependencyActivatorBase {
    public void init(BundleContext ctx, DependencyManager dm) throws Exception {
        Component c = createComponent()
           .setInterface(TranslationService.class.getName(), null)
           .setImplementation(GoogleBasedTranslationService.class)
           .add(createServiceDependency()
              .setService(LocalizationService.class, "(language=en)")
              .setRequired(true))
           .add(createServiceDependency()
              .setService(LogService.class)
              .setCallbacks("bind", null /* no unbind method */)
              .setRequired(false)));
        dm.add(c);
   }
}

Notice that when you define an optional dependency without using callbacks, then a "NullObject" method is injected in the class field (by reflection) when the actual optional service is not available. In this case any invocation on the optional service won’t do anything.