Top Banner
Declarative Services Dependency Injection OSGi Style Felix Meschberger | Day Management AG
38

Declarative Services

Apr 16, 2017

Download

Technology

Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Declarative Services

Declarative Services

Dependency Injection OSGi Style

Felix Meschberger | Day Management AG

Page 2: Declarative Services

2

About Felix Meschberger

• Senior Developer at Day Management AG

[email protected]

• http://blog.meschberger.ch

• OSGi Implementations @ Apache Felix– Declarative Services

– Configuration Admin

– Metatype Service

Page 3: Declarative Services

3

Contents• Dependency Injection

• Implementations for OSGi

• Declarative Services

• Issues

• Declarative Services 1.1

• Maven SCR Plugin

• Apache Felix Extensions

Page 4: Declarative Services

4

Dependency Injection• Loose Coupling

– „Don't call use, we'll call you“

• Easier Testing– Inject different implementations

• Popular in Spring Framework

• Traditionally Descriptor Based

• Current Trend: Java Annotations

Page 5: Declarative Services

5

Implementations for OSGi• Dependency Manager

• Declarative Services

• iPOJO (Evolution of Declarative Services)

• Spring DM

• Blueprint Service (Evolution of Spring DM)

• Peaberry (based on Google Guice)

• … possibly more …

Page 6: Declarative Services

6

Declarative Services• Version 1.0, Compendium R4

• Version 1.1, Comendium R4.2

• XML Descriptor Based

• Lifecycle Management

• Dependency Injection (Services)

• Configuration Support

Page 7: Declarative Services

7

Component Descriptor• XML

• Descriptors may be embedded

• Namespace for Component

– http://www.osgi.org/xmlns/scr/v1.0.0

– http://www.osgi.org/xmlns/scr/v1.1.0

• Descriptors listed in Bundle Manifest Header

– Service-Component

• Multiple Components per Document

Page 8: Declarative Services

8

Component Descriptor

<scr:component name=“sample.component“ xmlns:scr=“http://www.osgi.org/xmlns/scr/v1.1.0“> <implementation class=“org.sample.Component“ /> <reference interface=“org.osgi.service.log.LogService“ bind=“bindLog unbind=“unbindLoad“ /> <property name=“p1“ value=“sample“ /> <property name=“p2“ type=“Integer“> 1 2 </property></component>

Page 9: Declarative Services

9

Lifecycle Management• Load Descriptors on Bundle Start

• Instantiation

• Configuration

• Activation

• Dependency Injection

• Deactivation

• Unload on Bundle Stop

Page 10: Declarative Services

10

Component Descriptor

<scr:component name=“sample.component“ xmlns:scr=“http://www.osgi.org/xmlns/scr/v1.1.0“> <implementation class=“org.sample.Component“ /> <reference interface=“org.osgi.service.log.LogService“ bind=“bindLog unbind=“unbindLoad“ /> <property name=“p1“ value=“sample“ /> <property name=“p2“ type=“Integer“> 1 2 </property></component>

Page 11: Declarative Services

11

Lifecycle: Activation

package org.sample;public class Component { protected void activate( ComponentContext c) { System.out.println(„Activating“); } protected void deactivate( ComponentContext c) { System.out.println(„Deactivating“); }}

Page 12: Declarative Services

12

Lifecycle: Bindingpackage org.sample;public class Component { protected void bindLog( LogService ls) { this.logService = ls } protected void unbindLog( LogService ls) { this.logService = null; }}

Page 13: Declarative Services

13

Lifecycle: Configurationpackage org.sample;public class Component { protected void activate( ComponentContext c) { Dictionary props = c.getProperties(); String p1 = (String) props.get(„p1“); int[] p2 = (int[]) props.get(„p2“); }}

Page 14: Declarative Services

14

Component Types• Regular Component (non-service)

• Service

• Service Factory

• Component Factory

Page 15: Declarative Services

15

Dependency Injection• Event-based using bind/unbind methods

• Lookup oriented using ComponentContext

• Optionality

• Multiplicity

• Binding Policy

Page 16: Declarative Services

16

Configuration• Configuration from Configuration Admin

• Properties from Descriptor

• Provided through ComponentContext.getProperties()

Page 17: Declarative Services

17

Instantiation• If Enabled and Satisfied

• Single Instance– No Configuration (unless required)

– Singleton Configuration (service.pid)

• Multiple Instances– Factory Configuration (service.factoryPid)

Page 18: Declarative Services

18

Component Factory• ComponentFactory.newInstance()

• ComponentInstance.dispose()

• Controlled by Application only

• Global Singleton Configuration only

Page 19: Declarative Services

19

Descriptor Unvealed<scr:component name= enabled= immediate= factory= configuration-policy= activate= deactivate= modified=> … Component Description …

• </scr:component>

Page 20: Declarative Services

20

Descriptor Unvealed<implementation class=/>

Page 21: Declarative Services

21

Descriptor Unvealed<property name= value= type=/>

<property name= type=> … values …</property>

Page 22: Declarative Services

22

Descriptor Unvealed<properties entry=/>

Page 23: Declarative Services

23

Descriptor Unvealed<service servicefactory=> <provide interface= /> … More Provide Elements …</service>

Page 24: Declarative Services

24

Descriptor Unvealed<reference name= interface= cardinality= policy= target= bind= unbind=/>

Page 25: Declarative Services

25

Issues• Configuration Data Types

• Components not really POJO (DS 1.0)

• XML Descriptor

Page 26: Declarative Services

26

Configuration Data• Wrapper of primitive types

– Byte, Short, Integer, Long, etc.

• String

• Array or Vector

– Primitive types

– Wrappers of primitive types

– String

• Aligned with...

– Metatype Service Specification

– Configuration Admin Specification

Page 27: Declarative Services

27

DS 1.0 not really POJO• Requires OSGi API for full functionality

• Activate and Deactivate method names fixed and public or protected

• Configuration through ComponentContext

• Reference Service Properties through ServiceReference

• Fixed in Declarative Services 1.1

Page 28: Declarative Services

28

DS 1.1• Configurable names for (de)activator

methods

• More (de)activator method arguments– ComponentContext

– BundleContext

– Map

– int/Integer (deactivator only)

– Any combination

Page 29: Declarative Services

29

DS 1.1 (cont.)

• More (un)bind method arguments

– ServiceReference

– Service instance

– Service instance and Map

• Configuration Dependency

– Optional

– Ignore

– Require

• Support for private properties

Page 30: Declarative Services

30

DS 1.1 (cont.)

• Activator and bind methods may be– public (discouraged)

– protected

– private (if in the component class)

– default (if in the same package)

• New features require DS 1.1 Namespace

• Service-Component supports Wildcards– E.g. OSGi-INF/ds*.xml

Page 31: Declarative Services

31

XML Descriptor• Good to re-use legacy POJO

• Problematic to keep in-sync with DS Classes

• YAXF – Yet another XML File

Page 32: Declarative Services

32

Maven SCR Plugin• Generates Descriptors from Java Source

– JavaDoc tags• @scr.component, @scr.property, ...

– Java Annotations• @Component, @Property, ...

– High Level Annotations• @SlingServlet

• Alternative: Peter Kriens' BND library

Page 33: Declarative Services

33

Component Descriptor

<scr:component name=“sample.component“ xmlns:scr=“http://www.osgi.org/xmlns/scr/v1.1.0“> <implementation class=“org.sample.component“ /> <reference interface=“org.osgi.service.log.LogService“ bind=“bindLog unbind=“unbindLoad“ /> <property name=“p1“ value=“sample“ /> <property name=“p2“ type=“Integer“> 1 2 </property></component>

Page 34: Declarative Services

34

SCR Annotations

package org.sample;@Componentpublic class Component { @Reference private LogService log; @Property(value=“sample“) private String p1; @Property(value=“1,2“) private int[] p2; protected void activate( ComponentContext c) { System.out.println(„Activating“); } protected void deactivate( ComponentContext c) { System.out.println(„Deactivating“); }}

Page 35: Declarative Services

35

SCR JavaDoc Tags

package org.sample;/** @scr.component */ public class Component { /** @scr.reference / private LogService log; /** @scr.property value=“sample“ */ private String p1; /** @scr.property values.0=“1“ values.1=“2“ */ private int[] p2; protected void activate( ComponentContext c) { System.out.println(„Activating“); } protected void deactivate( ComponentContext c) { System.out.println(„Deactivating“); }}

Page 36: Declarative Services

36

Apache Felix Extensions• Management API

– Since Apache Felix SCR 1.0

– Now also in Equinox DS 1.2.0v20100125

• Service Reference: updated– Since Apache Felix SCR 1.4.0

– OSGi Bug #63

Page 37: Declarative Services

37

Questions

Page 38: Declarative Services

38

Thank You!