Apache
Home » Documentation » Apache Felix Dependency Manager

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.

Rev. 1843267 by pderop on Tue, 9 Oct 2018 13:34:37 +0000
Apache Felix, Felix, Apache, the Apache feather logo, and the Apache Felix project logo are trademarks of The Apache Software Foundation. All other marks mentioned may be trademarks or registered trademarks of their respective owners.