Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

...

Usage example of a Service whose dependency filter is configured from ConfigAdmin, using a "named" dependency
(please check Apache Felix Dependency Manager - Using Annotations - Lifecycle#Dynamic Dependency Configuration for more informations about "named" dependencies):

Code Block
      /**
        * A Service whose service dependency "otherService" filter is configured from ConfigAdmin
        */
      @Service
      class X {
          private Dictionary m_config;

          /**
           * Initialize our service from config ... and store the config for later usage (from our init method)
           */
          @ConfigurationDependency(pid="MyPid")
          void configure(Dictionary conf) {
               m_config = config;
          }

          /**
           * All unnamed dependencies are injected: we can now configure other named
           * dependencies, using the already injected configuration.
           * The returned Map will be used to configure our "otherService" Dependency.
           */
          @Init
          Map init() {
              return new HashMap() {{
                  put("otherService.filter", m_config.get("filter"));
                  put("otherService.required", m_config.get("required"));
              }};
          }

          /**
           * This named dependency filter/required flag will be configured by our init method (see above).
           */
          @ServiceDependency(name="otherService")
          void bindOtherService(OtherService other) {
          }

          /**
           * All dependencies are injected and our service is now ready to be published.
           * Notice that you can also use the publisher service attribute if you need
           * to take control on service exposition.
           */
          @Start
          void start() {
          }
      }

...

  • pid: Returns the pid for a given service (by default, the pid is the service class name).
  • propagate: Returns true if the configuration properties must be published along with the service. Any additional service properties specified directly are merged with these.
  • heading: The label used to display the tab name (or section) where the properties are displayed. Example: "Printer Service".
  • description: A human readable description of the PID this annotation is associated with. Example: "Configuration for the PrinterService bundle".
  • Wiki Markup*metadata*: an array of PropertyMetadaData\[\] annotation describing property types (see the FactoryConfigurationAdapterService section in the "Writing Components" section.

Usage Examples

In the following example, the "Printer" component depends on a configuration whose PID name is "org.apache.felix.sample.Printer". This service will initialize its ip/port number from the provided configuration:

...

Code Block
     @Component
     public class SCR {
         @BundleDependency(required = false,
                           removed = "unloadServiceComponents",
                           filter = "(Service-Component=*)"
                           stateMask = Bundle.ACTIVE)
         void loadServiceComponents(Bundle b) {
             String descriptorPaths = (String) b.getHeaders().get("Service-Component");
             // load all service component specified in the XML descriptorPaths files ...
         }

         void unloadServiceComponents(Bundle b) {
             // unload all service component we loaded from our "loadServiceComponents" method.
         }
     }

...