OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

196
Component Oriented Development in OSGi with Declarative Services, Spring Dynamic Modules and Apache iPOJO Neil Bartlett 1 Heiko Seeberger 2 1 Weigle Wilczek UK 2 Weigle Wilczek GmbH March 24, 2009 c 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 1 / 174

description

Tutorial on "Component Oriented Development in OSGi with DS, Spring and iPOJO" at OSGi DevCon 09 (EclipseCon 09) in Santa Clara on 2009-03-23.

Transcript of OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Page 1: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Component Oriented Development in OSGi withDeclarative Services, Spring Dynamic Modules and

Apache iPOJO

Neil Bartlett1 Heiko Seeberger2

1Weigle Wilczek UK

2Weigle Wilczek GmbH

March 24, 2009

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 1 / 174

Page 2: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Part I

Introduction

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 2 / 174

Page 3: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

The (Partial) Failure of Object Orientation

Contents

1 The (Partial) Failure of Object Orientation

2 What is a Component?

3 Implementing Components

4 Example Application

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 3 / 174

Page 4: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

The (Partial) Failure of Object Orientation

The (Partial) Failure of Object Oriented

One of the primary goals of object oriented programming (OOP) was,and still is, re-use.

It has mostly failed in that goal.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 4 / 174

Page 5: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

The (Partial) Failure of Object Orientation

The (Partial) Failure of Object Oriented

One of the primary goals of object oriented programming (OOP) was,and still is, re-use.

It has mostly failed in that goal.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 4 / 174

Page 6: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

The (Partial) Failure of Object Orientation

The (Partial) Failure of Object Oriented

Peter Kriens

“Object Oriented technology was going to change the world. . . we wouldhave all these objects in our library and building a new system would be asnap. Just get a few classes, bunch them together. . . and voila!”

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 5 / 174

Page 7: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

The (Partial) Failure of Object Orientation

What Went Wrong??

Coupling

Classes can almost never be used in isolation – they depend on otherclasses.

Those classes depend on other packages, which depend on otherJARs. . .

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 6 / 174

Page 8: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

The (Partial) Failure of Object Orientation

What Went Wrong??

Coupling

Classes can almost never be used in isolation – they depend on otherclasses.

Those classes depend on other packages, which depend on otherJARs. . .

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 6 / 174

Page 9: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

The (Partial) Failure of Object Orientation

What Went Wrong??

Coupling

Classes can almost never be used in isolation – they depend on otherclasses.

Those classes depend on other packages, which depend on otherJARs. . .

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 6 / 174

Page 10: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

The (Partial) Failure of Object Orientation

What Went Wrong??

Eventually just to use one small class we end up doing this:

Maven

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 7 / 174

Page 11: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

The (Partial) Failure of Object Orientation

A Solution?

Re-use of classes outside their original context is hard, so. . .

Give up!

Leave them where they are, and call over the network!

This is sometimes called “SOA”.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 8 / 174

Page 12: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

The (Partial) Failure of Object Orientation

A Better Solution

Component Oriented Programming

Builds on OOP.

OOP is not bad, it’s just not the whole answer.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 9 / 174

Page 13: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

Contents

1 The (Partial) Failure of Object Orientation

2 What is a Component?

3 Implementing Components

4 Example Application

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 10 / 174

Page 14: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

Components

But wait, what is a “component”, vs an object?

Good question! Many attempts have been made to define the term.

The following is not a formal academic definition, just a workingdefinition that we have found useful in practice.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 11 / 174

Page 15: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

Components

But wait, what is a “component”, vs an object?

Good question! Many attempts have been made to define the term.

The following is not a formal academic definition, just a workingdefinition that we have found useful in practice.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 11 / 174

Page 16: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

The Most Common Analogy

Lego?

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 12 / 174

Page 17: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

Lego is a Poor Analogy

Just dead lumps of plastic.

All look and act the same.

Not even very re-usable (try using a Duplo block in a Lego Technicsmodel!).

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 13 / 174

Page 18: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

A Better Analogy

Bees/Animals

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 14 / 174

Page 19: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

Components Are:. . .

Active participants in the system.

Aware of and adapt to their environment.

May provide services to other components and use services from othercomponents.

Have a life cycle.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 15 / 174

Page 20: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

Components Are:. . .

Active participants in the system.

Aware of and adapt to their environment.

May provide services to other components and use services from othercomponents.

Have a life cycle.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 15 / 174

Page 21: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

Components Are:. . .

Active participants in the system.

Aware of and adapt to their environment.

May provide services to other components and use services from othercomponents.

Have a life cycle.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 15 / 174

Page 22: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

Components Are:. . .

Active participants in the system.

Aware of and adapt to their environment.

May provide services to other components and use services from othercomponents.

Have a life cycle.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 15 / 174

Page 23: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

What Does the “Environment” Mean?

Services provided by other components.

Resource, devices, etc.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 16 / 174

Page 24: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

What is a Component?

Adaptation

When the environment is good, the component flourishes.

When the environment is harsh, the component survives.

When very harsh, the component sleeps or dies.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 17 / 174

Page 25: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Implementing Components

Contents

1 The (Partial) Failure of Object Orientation

2 What is a Component?

3 Implementing Components

4 Example Application

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 18 / 174

Page 26: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Implementing Components

Implementing Components

OSGi is the perfect environment for implementing components.

The module layer allow us to minimise our static dependencies.

Fewer static dependencies means less stuff that must be present forour component to work.

Services allow our component to interact with other components.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 19 / 174

Page 27: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Implementing Components

Implementing Components

POJOs

Components should be implemented as POJOs (Plain Old Java Objects)“glued” together with OSGi services.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 20 / 174

Page 28: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

Contents

1 The (Partial) Failure of Object Orientation

2 What is a Component?

3 Implementing Components

4 Example Application

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 21 / 174

Page 29: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

The Example Application

The example is a simplistic “contact manager” application.

Capable of displaying the content of multiple contact “repositories”.

Each repository appears in its own tab.

Repositories are implemented as OSGi services.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 22 / 174

Page 30: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

Example Architecture

Services Diagram

app.ui.*

ContactRepository

ContactRepositoryListener

core.inmemory0..1

core.directory

LogService

0..1

0..N

0..N

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 23 / 174

Page 31: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

The Example Application

Contact Repository Viewer

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 24 / 174

Page 32: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

Running the Example Application

First start Equinox using the “Core” launcher from Eclipse’s Run menu.

Equinox Console

osgi> install file : contacts_api . jarBundle id is 3

osgi> install file : swingui . jarBundle id is 4

osgi> start 4

The UI should now appear, but with no contact repository tabs.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 25 / 174

Page 33: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

Installing a Basic Contact Repository

Equinox Console

osgi> install file : . . / ComponentsRaw/contacts . core . inmemory_raw . jarBundle id is 5

osgi> start 5

You should see two repositories: “Some Dummies” and “OSGi Nerds”.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 26 / 174

Page 34: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

The “Raw” Components

The ComponentsRaw project contains two repository implementations.

They are implemented using “raw” OSGi APIs, i.e. ServiceTracker.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 27 / 174

Page 35: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

Implementing Components with Raw OSGi

It is possible to implement components using just the raw OSGi APIs.But there are several challenges.

We need to be cautious to separate component code from OSGi“glue”. If OSGi APIs are used in our components it makes themdifficult to test and non-POJO.

It is much harder to access services and configuration using raw APIs.

Small changes in desired behaviour – e.g. a switch from mandatory tooptional dependence on a service – require large changes in our gluecode.

Much of the glue code is repetitive – mostly the same for manydifferent components.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 28 / 174

Page 36: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

Component Frameworks

We would like to use a framework to ease implementation ofcomponents in OSGi.

There is more than one to choose from!

In this tutorial we look at three popular choices: Declarative Services;Spring Dynamic Modules; and Apache iPOJO.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 29 / 174

Page 37: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

A More Interesting Component

For most of this tutorial we will focus on a more interesting and complexexample.

The DirectoryRepository component implements a contactrepository backed by files in a directory.

It is active: it creates a thread to monitor the directory.

It needs configuration: the directory to monitor.

It consumes services provided by other components: the log serviceand some listeners.

It provides a service to other components: the contact repositoryfunctionality.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 30 / 174

Page 38: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Example Application

Getting Stuff

Exercises:http://neilbartlett.name/downloads/eclipsecon2009/labs.zip

Solutions:http://neilbartlett.name/downloads/eclipsecon2009/solutions.zip

These Slides:http://neilbartlett.name/downloads/eclipsecon2009/slides.pdf

NB these are temporary URLs until the files have been uploaded toeclipsecon.org.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 31 / 174

Page 39: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Part II

Declarative Services

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 32 / 174

Page 40: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Contents

5 Introduction

6 A Minimal Example

7 Activation and Deactivation

8 References to Services

9 Optional vs Mandatory Service References

10 Static vs Dynamic Components

11 Publishing a Service

12 Lazy Service Creation

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 33 / 174

Page 41: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Declarative Services

“Declarative Services” (DS) is a specification from the OSGiCompendium, section 112. It was introduced in Release 4.0 and is basedon the extender model.

Like all extenders, DS performs tasks on behalf of other bundles.

The DS spec defines this extender and it is implemented byframeworks. The extender bundle itself is called the “ServiceComponent Runtime” or SCR.

The terms DS and SCR are sometimes confused. Remember, DS is thespecification, SCR is the actual bundle that implements the specification.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 34 / 174

Page 42: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Declarative Services

There are significant improvements in DS in OSGi R4.2.

Many of these changes are supported in Equinox 3.5M5+.

We will use the R4.2 features, but mention when we do so.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 35 / 174

Page 43: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Declarative Services

What does the SCR extender bundle do on our behalf?

1 Creates Components.

2 “Binds” them to services and configuration.

3 Manages the component’s lifecycle in response to bound servicescoming and going.

4 Optionally, publishes our components as services themselves.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 36 / 174

Page 44: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Declarative Services

What does the SCR extender bundle do on our behalf?

1 Creates Components.

2 “Binds” them to services and configuration.

3 Manages the component’s lifecycle in response to bound servicescoming and going.

4 Optionally, publishes our components as services themselves.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 36 / 174

Page 45: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Declarative Services

What does the SCR extender bundle do on our behalf?

1 Creates Components.

2 “Binds” them to services and configuration.

3 Manages the component’s lifecycle in response to bound servicescoming and going.

4 Optionally, publishes our components as services themselves.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 36 / 174

Page 46: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Declarative Services

What does the SCR extender bundle do on our behalf?

1 Creates Components.

2 “Binds” them to services and configuration.

3 Manages the component’s lifecycle in response to bound servicescoming and going.

4 Optionally, publishes our components as services themselves.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 36 / 174

Page 47: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Declarative Services

What does the SCR extender bundle do on our behalf?

1 Creates Components.

2 “Binds” them to services and configuration.

3 Manages the component’s lifecycle in response to bound servicescoming and going.

4 Optionally, publishes our components as services themselves.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 36 / 174

Page 48: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Contents

5 Introduction

6 A Minimal Example

7 Activation and Deactivation

8 References to Services

9 Optional vs Mandatory Service References

10 Static vs Dynamic Components

11 Publishing a Service

12 Lazy Service Creation

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 37 / 174

Page 49: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

A Minimal Component Declaration

minimal.xml

<?xml version="1.0" encod ing="UTF -8"?><s c r : component xm l n s : s c r="http://www.osgi.org/xmlns/scr/v1.1.0">

<imp l ementa t i on c l a s s="org.example.osgi.ds.HelloComponent"/>

</ sc r : component>

NB: the namespace is required in order to use R4.2 features. If notincluded then SCR will default to the prior version.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 38 / 174

Page 50: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

A Minimal Component Declaration

This declaration requests SCR to simply instantiate the named class,which must be visible to the declaring bundle’s classloader.

We need to tell the SCR extender bundle about this file.

We use a manifest header, Service-Component.

A comma-separated list of XML declaration files.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 39 / 174

Page 51: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

A Minimal Component Declaration

MANIFEST.MF

Bundle−SymbolicName : mybundle

Bundle−Version : 1 . 0 . 0Service−Component : OSGI−INF/minimal . xml. . .

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 40 / 174

Page 52: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

A Minimal Component Declaration

HelloComponent

package org . example . osgi . ds ;

public class HelloComponent {public HelloComponent ( ) {

System . out . println ( "HelloComponent created" ) ;}

// . . .}

Note: a Plain Old Java Object (POJO)! No OSGi API dependencies.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 41 / 174

Page 53: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Building the Bundle

Internal Bundle Structure

minimal_ds . jar/META−INF/

MANIFEST . MFOSGI−INF/

minimal . xmlorg/

example/osgi/

ds/HelloComponent . class

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 42 / 174

Page 54: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Running the Example

We need to install the SCR bundle from Equinox, and also a utility bundleused by Equinox’s SCR:

org.eclipse.equinox.ds <version>.jar

org.eclipse.equinox.util <version>.jar

The SCR bundle needs to be started, but the util bundle does not.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 43 / 174

Page 55: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Running the Example

Console

osgi> install file : org . eclipse . equinox . ds_1 . 1 . 0 . v20090112 −1800. jarBundle id is 2

osgi> install file : org . eclipse . equinox . util_1 . 0 . 1 . v20081205 −180 . . .Bundle id is 3

osgi> start 2

osgi> ss

Framework is launched .

id State Bundle

0 ACTIVE org . eclipse . osgi_3 . 4 . 2 . R34x_v20080826−12301 RESOLVED org . eclipse . osgi . services_3 . 2 . 0 . v20081205−18002 ACTIVE org . eclipse . equinox . ds_1 . 1 . 0 . v20090112−18003 RESOLVED org . eclipse . equinox . util_1 . 0 . 1 . v20081205−1800

osgi>

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 44 / 174

Page 56: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Running the Example

Now install and start the example bundle:

Console

osgi> install file : minimal_ds . jarBundle id is 4

osgi> start 4HelloComponent created

osgi>

Note that SCR ignores our bundle until it is in ACTIVE state. DS bundlesmust be activated even though they often have no bundle activator! Thisis quite different from Eclipse Extensions.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 45 / 174

Page 57: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

Contents

5 Introduction

6 A Minimal Example

7 Activation and Deactivation

8 References to Services

9 Optional vs Mandatory Service References

10 Static vs Dynamic Components

11 Publishing a Service

12 Lazy Service Creation

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 46 / 174

Page 58: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

Activation and Deactivation

That was a very long-winded way to merely instantiate a class!

This component is not useful because it cannot even do anything.

However, DS allows us to define lifecycle methods.

We can be notified when the component starts and stops.

This allows us to do interesting things like start threads, opensockets, etc.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 47 / 174

Page 59: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

An Active Component

PollingComponent

public class PollingComponent {

private static final int DEFAULT_PERIOD = 2000 ;private PollingThread thread ;

protected void activate ( Map<String , Object> config ) {System . out . println ( "Polling Component Activated" ) ;Integer period = ( Integer ) config . get ( "period" ) ;thread = new PollingThread (

period != null ? period : DEFAULT_PERIOD ) ;thread . start ( ) ;

}protected void deactivate ( ) {

System . out . println ( "Polling Component Deactivated" ) ;thread . interrupt ( ) ;

}}

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 48 / 174

Page 60: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

Activation and Deactivation

SCR will find our activate/deactivate methods automatically.

We can call them something else by adding attributes to the XMLdeclaration.

NB: Before R4.2, the method names could not be changed and they hadto take a parameter of type ComponentContext, from the DS API. Thisbroke the pojocity of the component.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 49 / 174

Page 61: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

Activation and Deactivation

Why didn’t we just write this as a bundle activator??

This is a POJO!

Easier access to configuration – the Map parameter to activate.

Easier access to service registry – we will see this soon.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 50 / 174

Page 62: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Contents

5 Introduction

6 A Minimal Example

7 Activation and Deactivation

8 References to Services

9 Optional vs Mandatory Service References

10 Static vs Dynamic Components

11 Publishing a Service

12 Lazy Service Creation

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 51 / 174

Page 63: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

References to Services

Using lower level APIs we must write a lot of “glue” code to bind toservices.

DS replaces the glue code with simple declarations.

We declare references to services.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 52 / 174

Page 64: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

References to Services

Example reference Element

< r e f e r e n c e name="LOG"

i n t e r f a c e="org.osgi.service.log.LogService"

b ind="setLog" unbind="unsetLog"/>

Reference Attributes

name The name of the reference.

interface The service interface name.

bind The name of the “set” method associated with the ref-erence.

unbind The name of the “unset” method associated with thereference.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 53 / 174

Page 65: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Optional vs Mandatory Service References

Contents

5 Introduction

6 A Minimal Example

7 Activation and Deactivation

8 References to Services

9 Optional vs Mandatory Service References

10 Static vs Dynamic Components

11 Publishing a Service

12 Lazy Service Creation

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 54 / 174

Page 66: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Optional vs Mandatory Service References

Optional vs Mandatory References

We previously discussed the idea of optional and mandatory servicedependencies.

To model these with ServiceTracker required completely differentcode patterns.

With DS we can simply change a single attribute on the referenceelement to switch between optional and mandatory.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 55 / 174

Page 67: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Optional vs Mandatory Service References

Optional Service Reference

Example reference Element

< r e f e r e n c e name="LOG"

i n t e r f a c e="org.osgi.service.log.LogService"

b ind="setLog" unbind="unsetLog"

c a r d i n a l i t y="0..1"/>

The default cardinality was “1..1” meaning that we must haveexactly one instance, i.e. the reference is mandatory.

A cardinality of “0..1” indicates that either zero or one instance isokay, i.e. the reference is optional.

Yes, “0..n” and “1..n” do exist. We will look at these later.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 56 / 174

Page 68: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Optional vs Mandatory Service References

Lab 1 : Building the Directory Repository (Setup)

1 Install and start the commands.jar bundle which gives us a usefulinstallDir command.

osgi> install file : commands . jarBundle id is 3

osgi> start 3

2 Install the Contacts API bundle, and the DS bundles:

osgi> install file : contacts_api . jarBundle id is 4

osgi> installDir . . / ComponentsDS/bundles

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 57 / 174

Page 69: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Optional vs Mandatory Service References

Lab 1 : Building the Directory Repository

1 Complete the implementation of the DirectoryRepositoryDS class– TODO markers explain what is needed.

2 Complete the DS XML descriptor directoryRepository.xml in thedsxml directory. Remember to add at least:

I A property element to set the dirName property to the name of thecontacts directory.

I An optional reference to the OSGi log service(org.osgi.service.log.LogService).

I A zero-to-many reference to the repository listeners.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 58 / 174

Page 70: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Optional vs Mandatory Service References

Lab 1 : Testing the Component

1 Build the bundle using the supplied ANT build.

2 Install and start the bundle and also start the SCR extender bundle(org.eclipse.equinox.ds...).

3 Type the log command to see messages from the component.Observe what happens when .contact files are added/removed inthe contacts directory.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 59 / 174

Page 71: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Contents

5 Introduction

6 A Minimal Example

7 Activation and Deactivation

8 References to Services

9 Optional vs Mandatory Service References

10 Static vs Dynamic Components

11 Publishing a Service

12 Lazy Service Creation

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 60 / 174

Page 72: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Static vs Dynamic Components

If we stop the log bundle (org.eclipse.equinox.log...) we should seesomething like this:

osgi> stop 6DirectoryRepositoryDS constructed

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 61 / 174

Page 73: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Static vs Dynamic Components

. . . and when restarting the log bundle :

osgi> start 6DirectoryRepositoryDS constructed

It seems our service is being destroyed and recreated each time thereferent goes away or comes back. Why??

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 62 / 174

Page 74: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Static Policy

By default, DS uses a “static policy” for updating references toservices.

This means it hides the complexity of dealing with dynamicallychanging references. We need not worry about service referencesbeing replaced while we are using them or using synchronized.

It does this simply by destroying and recreating the componentinstance each time the references change.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 63 / 174

Page 75: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Efficiency of the Static Policy

Much of the time, this isn’t too expensive, and it’s a reasonable tradeoff.

Donald Knuth

“Premature optimisation is the root of all evil.”

Object instantiation in Java is cheap!

However, sometimes this is a bad idea.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 64 / 174

Page 76: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Efficiency of the Static Policy

Dependent Services Graph

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 65 / 174

Page 77: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Efficiency of the Static Policy

Dependent Services Graph

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 66 / 174

Page 78: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Efficiency of the Static Policy

Dependent Services Graph

♺♺♺♺

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 67 / 174

Page 79: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Efficiency of the Static Policy

Dependent Services Graph

♺♺♺♺

♺♺♺♺♺♺

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 68 / 174

Page 80: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Dynamic Policy

Fortunately “static” is only the default. We can change it simply bydeclaring policy="dynamic".

Example reference Element

< r e f e r e n c e name="LOG"

i n t e r f a c e="org.example.osgi.log.Log"

b ind="setLog" unbind="unsetLog"

c a r d i n a l i t y="0..1"

p o l i c y="dynamic"/>

But now we need to worry about being “dynamic-safe”.

The bind/unbind method might be called while a service method thatuses the referent is executing.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 69 / 174

Page 81: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Coping with Dynamic Effects

We already made our log field volatile for visibility purposes. Butthis is not enough to ensure we can cope with changes to the referredservice.

Accessing the Referred Service

if ( log != null ) {log . log ( Log . INFO , "This is a message" ) ;

}

This is a pattern (or anti-pattern!) known as “check-then-act”.

It fails because the log reference may be non-null on the first line andthen be set to null before the second line executes.

Result: NullPointerException.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 70 / 174

Page 82: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Coping with Dynamic Effects

A possible solution is to wrap this code in a synchronized block:

Accessing the Referred Service

synchronized ( this ) {if ( log != null ) {

log . log ( Log . INFO , "This is a message" ) ;}

}

Note we would also have to make the bind and unbind methodssynchronized.

However this reduces the concurrency of our program, and it isunwise to hold a lock when calling a service.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 71 / 174

Page 83: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Coping with Dynamic Effects

It is better to use a small synchronized block just to read the field,then act outside the block:

Accessing the Referred Service Outside synchronized

Log log = null ;synchronized ( this ) {

log = this . log ;}if ( log != null ) {

log . log ( Log . INFO , "This is a message" ) ;}

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 72 / 174

Page 84: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Coping with Dynamic Effects

A lightweight alternative solution is to use an AtomicReference.

Accessing the Referred Service

AtomicReference<Log> logRef ;

// . . .

Log log = logRef . get ( )if ( log != null ) {

log . log ( Log . INFO , "This is a message" ) ;}

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 73 / 174

Page 85: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Dynamic and Mandatory

What is the effect of dynamic policy with a mandatory reference?

When a mandatory reference is no longer satisfied, the componentmust be discarded. When the reference becomes satisfied again, thecomponent is recreated.

This is the case for both static and dynamic policy. So does dynamicpolicy make sense for a mandatory reference?

Yes. With dynamic policy, the service reference can be replaced ifthere is another immediately available.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 74 / 174

Page 86: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Dynamic and Mandatory

What is the effect of dynamic policy with a mandatory reference?

When a mandatory reference is no longer satisfied, the componentmust be discarded. When the reference becomes satisfied again, thecomponent is recreated.

This is the case for both static and dynamic policy. So does dynamicpolicy make sense for a mandatory reference?

Yes. With dynamic policy, the service reference can be replaced ifthere is another immediately available.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 74 / 174

Page 87: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Dynamic and Mandatory

What is the effect of dynamic policy with a mandatory reference?

When a mandatory reference is no longer satisfied, the componentmust be discarded. When the reference becomes satisfied again, thecomponent is recreated.

This is the case for both static and dynamic policy. So does dynamicpolicy make sense for a mandatory reference?

Yes. With dynamic policy, the service reference can be replaced ifthere is another immediately available.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 74 / 174

Page 88: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Dynamic and Mandatory

What is the effect of dynamic policy with a mandatory reference?

When a mandatory reference is no longer satisfied, the componentmust be discarded. When the reference becomes satisfied again, thecomponent is recreated.

This is the case for both static and dynamic policy. So does dynamicpolicy make sense for a mandatory reference?

Yes. With dynamic policy, the service reference can be replaced ifthere is another immediately available.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 74 / 174

Page 89: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Dynamic Service Replacement

Beware!

When a service is dynamically replaced, SCR first calls the bind methodwith the new service, then calls the unbind method with the old service.Therefore the naıve unbind method as follows is wrong:

protected synchronized void unbind ( Log log ) {this . log = null ;

}

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 75 / 174

Page 90: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Dynamic Service Replacement

To do this correctly in a synchronized block we would have to checkthe value as follows:

Correct Unbinding with synchronized

protected synchronized void unsetLog ( Log log ) {if ( this . log == log ) this . log = null ;

}

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 76 / 174

Page 91: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Dynamic Service Replacement

With AtomicReference it can be done more elegantly:

Correct Unbinding with AtomicReference

protected void unsetLog ( Log log ) {logRef . compareAndSet ( log , null ) ;

}

This atomically sets the value of logRef to null iff the current valueis log.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 77 / 174

Page 92: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Multiple References

So far we have looked only at unary references, 0..1 or 1..1.

We noted that 0..n and 1..n also exist.

At this point there is nothing difficult or surprising in going fromunary to multiple references.

With a multiple reference the bind/unbind methods are called foreach individual service instance.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 78 / 174

Page 93: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Multiple References

So far we have looked only at unary references, 0..1 or 1..1.

We noted that 0..n and 1..n also exist.

At this point there is nothing difficult or surprising in going fromunary to multiple references.

With a multiple reference the bind/unbind methods are called foreach individual service instance.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 78 / 174

Page 94: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Multiple References

So far we have looked only at unary references, 0..1 or 1..1.

We noted that 0..n and 1..n also exist.

At this point there is nothing difficult or surprising in going fromunary to multiple references.

With a multiple reference the bind/unbind methods are called foreach individual service instance.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 78 / 174

Page 95: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Multiple References

So far we have looked only at unary references, 0..1 or 1..1.

We noted that 0..n and 1..n also exist.

At this point there is nothing difficult or surprising in going fromunary to multiple references.

With a multiple reference the bind/unbind methods are called foreach individual service instance.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 78 / 174

Page 96: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Static vs Dynamic Components

Multiple References

Important

Multiple references must use the dynamic policy. Static policy simplymakes no sense. Thread safety is therefore important and unavoidable.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 79 / 174

Page 97: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing a Service

Contents

5 Introduction

6 A Minimal Example

7 Activation and Deactivation

8 References to Services

9 Optional vs Mandatory Service References

10 Static vs Dynamic Components

11 Publishing a Service

12 Lazy Service Creation

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 80 / 174

Page 98: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing a Service

Publishing a Service

The final piece of the puzzle is publishing our component as a serviceitself.

This is done with the <service> element in our XML descriptor.

Service Element

< s e r v i c e><p r o v i d e i n t e r f a c e="net... ContactRepository"/>

</ s e r v i c e>

Provide multiple services simply by adding additional <provide>elements.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 81 / 174

Page 99: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing a Service

Service Properties

We can specify service properties using the <property> element. Theseproperties are passed to the component in activation and published to theservice registry.

Property Element

<scr : component xmlns : scr="http ://www.osgi.org/xmlns/scr/v1.1.0">

<implementation class="..."/>

<property name="foo" value="bar"/>. . . .

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 82 / 174

Page 100: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing a Service

Lab 2 : Using the Dynamic Policy

1 Switch both references in the directoryRepository.xml to usedynamic policy.

2 Fix the component implementation to properly reflect dynamics.

3 Repeat the tests from the previous exercise.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 83 / 174

Page 101: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing a Service

Lab 2 : Publishing as a Service

1 Publish the component under the ContactRepository interface.

2 Set the service property name to the value Directory.

3 Check the output of the services command in the console.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 84 / 174

Page 102: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing a Service

Expected Results

osgi> start 7

osgi> services

. . .{net . eclipsetraining . osgi . contacts . api . ContactRepository}=

{name=Directory , dirName=contacts ,component . name=DirectoryRepository ,component . id=1, service . id=35}

Registered by bundle : contacts . core . directory_ds_0 . 0 . 0 [ 7 ]No bundles using service .. . .

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 85 / 174

Page 103: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing a Service

Two Important Points

1 The service appears to have been registered by our bundle eventhough it was really registered by SCR. Other bundles just see anormal service, they are not aware we are using DS.

2 Something was missing in the output on the previous slide. . . theprint statement from the constructor, “DirectoryRepositoryDSconstructed”. Why?

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 86 / 174

Page 104: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Lazy Service Creation

Contents

5 Introduction

6 A Minimal Example

7 Activation and Deactivation

8 References to Services

9 Optional vs Mandatory Service References

10 Static vs Dynamic Components

11 Publishing a Service

12 Lazy Service Creation

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 87 / 174

Page 105: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Lazy Service Creation

Lazy Service Creation

By default, SCR creates “delayed services”.

These are services that are registered in the service registry but theimplementation object has not yet been instantiated.

It will be instantiated “on-demand” when the first client attempts toactually use the service.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 88 / 174

Page 106: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Lazy Service Creation

The Problem with Eager Service Registration

Programmatic registration from a bundle activator results in servicesbeing registered eagerly.

As soon as our bundle starts, our service is created.

But we have no idea if any consumer will ever need our service!

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 89 / 174

Page 107: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Lazy Service Creation

The Problem with Eager Service Registration

Programmatic registration from a bundle activator results in servicesbeing registered eagerly.

As soon as our bundle starts, our service is created.

But we have no idea if any consumer will ever need our service!

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 89 / 174

Page 108: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Lazy Service Creation

The Problem with Eager Service Registration

Programmatic registration from a bundle activator results in servicesbeing registered eagerly.

As soon as our bundle starts, our service is created.

But we have no idea if any consumer will ever need our service!

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 89 / 174

Page 109: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Lazy Service Creation

The Cost of Eager Service Registration

Most simple service objects are cheap to create. . .

. . . but the class loader for the bundle is not quite so cheap!

Hundreds of bundles providing services that are never used createssignificant classloading overhead.

If our bundle has no activator and uses “delayed” services, there is noneed for the framework to create a classloader until the service isactually used.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 90 / 174

Page 110: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Lazy Service Creation

Immediate Services

Delayed creation is the default for services, but it can be turned off.

Service components can be declared with immediate="true" tomake SCR instantiate them immediately (assuming theirdependencies are satisfied).

Non-service components are always “immediate”.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 91 / 174

Page 111: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Part III

Spring-DM

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 92 / 174

Page 112: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Contents

13 Introduction

14 A Minimal Example

15 Activation and Deactivation

16 References to Services

17 Optional vs Mandatory Service References

18 Publishing Services

19 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 93 / 174

Page 113: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Spring Dynamic Modules (DM)

The Spring Framework is an extremely popular Dependency Injection(DI) framework.

It is widely used in many Java deployment scenarios, but particularlyin J2EE.

It has a strong focus on POJOs, interface-based development, andtestability.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 94 / 174

Page 114: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

The Spring Framework

Spring creates a container called the Application Context. Within thecontainer are multiple beans.

Spring Application Context

CustomerDAO

DataSource Log

CustomerManager

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 95 / 174

Page 115: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Spring Beans

Beans in Spring tend to be pure POJOs following the JavaBean pattern.

CustomerDAO

public class CustomerDAO {

private DataSource dataSource ;private Log log ;

public void setDataSource ( DataSource dataSource ) {this . dataSource = dataSource ;

}public void setLog ( Log log ) {

this . log = log ;}// . . .

}

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 96 / 174

Page 116: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Spring XML Configuration

Beans are instantiated, configured and “wired” together using an XMLdeclaration file.

Spring XML

<beans><bean i d="customerDb" c l a s s="org.spring ... DbDataSource">

<p r op e r t y name="url" v a l u e="jdbc:hsqldb:hsql: // localhost"/><p r op e r t y name="username" v a l u e="sa"/>

</bean>

<bean i d="customerDao" c l a s s="org.example ... CustomerDAO"><p r op e r t y name="dataSource" r e f="customerDb"/>

</bean></ beans>

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 97 / 174

Page 117: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Spring Framework Limitations

Spring works well and a huge number of components and patterns areavailable.

However it can be painful to scale up to large complex applications.

Thousands of beans in a flat namespace.

Start-up ordering concerns.

Lack of modularity.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 98 / 174

Page 118: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Spring Dynamic Modules

Spring-DM uses OSGi to modularise large Spring applications.

Does not fundamentally change the Spring container model. . . justallows the creation of multiple interoperating containers.

Spring-DM

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 99 / 174

Page 119: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Bridging Application Contexts

Spring-DM allows a large Application Context to be broken down intomany small ones.

It also offers “glue” between App Contexts based on importing andexporting beans.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 100 / 174

Page 120: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Bridging Application Contexts

Exporting a Bean

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 101 / 174

Page 121: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Bridging Application Contexts

Importing a Bean

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 102 / 174

Page 122: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Bridging Application Contexts

Exporting and Importing a Bean

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 103 / 174

Page 123: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Contents

13 Introduction

14 A Minimal Example

15 Activation and Deactivation

16 References to Services

17 Optional vs Mandatory Service References

18 Publishing Services

19 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 104 / 174

Page 124: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

A Minimal Example

minimal.xml

<?xml version="1.0" encoding="UTF -8"?><beans xmlns="http ://www.springframework.org/schema/beans"/>

<bean id="hello" class="org.example.osgi.ds.HelloComponent"/>

</beans>

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 105 / 174

Page 125: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Spring-DM Application Context

Like DS, Spring-DM uses an extender bundle which looks for XMLfiles.

Placed in a common location (META-INF/spring/*.xml) orreferenced by a Spring-Context manifest header.

MANIFEST.MF

Spring−Context : config/context . xml , config/context−osgi . xml

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 106 / 174

Page 126: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Running the Example

We need to install rather more bundles for Spring-DM to work... 12!

One of them is the extender bundle and must be started:

org.springframework.osgi.extender <version>.jar

Starting Spring-DM

osgi> ss

. . .17 RESOLVED org . springframework . osgi . extender_1 . 2 . 0 . m2. . .

osgi> start 17INFO [ org . spring . . . ] − Starting [ . . . extender ] bundle v . [ 1 . 2 . 0 . m2 ]INFO [ org . spring . . . ] − No custom extender configuration detected . . .INFO [ org . spring . . . ] − Initializing Timer

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 107 / 174

Page 127: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Spring-DM Application Context

Unlike DS, each XML file is not a single component.

Spring-DM creates one Application Context for the whole bundle.The contents is the union of all the listed XML files.

Some parts of this XML will be OSGi-specific.

Best Practice

OSGi-specific parts of the Spring XML should be placed in a separate file.This enables re-use of the generics parts when used in a non-OSGi runtime.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 108 / 174

Page 128: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

Contents

13 Introduction

14 A Minimal Example

15 Activation and Deactivation

16 References to Services

17 Optional vs Mandatory Service References

18 Publishing Services

19 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 109 / 174

Page 129: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

Activation and Deactivation

There are no default method names for activation and deactivation, wemust specify them via the bean declaration:

Init and Destroy Methods

<bean id="polling" class="org.example.osgi.dm.PollingComponent"

init−method="activate"

destroy−method="deactivate"><property name="period" value="2000"/>

</bean>

These methods are always zero-arg. Configuration is supplied via oursetter methods, or constructor injection.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 110 / 174

Page 130: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Contents

13 Introduction

14 A Minimal Example

15 Activation and Deactivation

16 References to Services

17 Optional vs Mandatory Service References

18 Publishing Services

19 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 111 / 174

Page 131: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

References to Services

“Importing” a bean from another context means referencing it as aservice.

Service Imports

<o s g i : r e f e r e n c e i d="importedLogSvc"

i n t e r f a c e="org.osgi.service.log.LogService"/>

<bean i d="loggingPollingBean" c l a s s="org.example ..."><p r op e r t y name="log" r e f="importedLogSvc"/>

</bean>

The reference element looks just like another bean, and can bereferenced by other beans using its ID as normal.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 112 / 174

Page 132: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Proxy Beans

In fact the reference really is just another bean. It is a generatedproxy that continuously tracks the backing service.

The proxy is injected once into each bean that refers to it.

Important!

Spring-DM does not directly inject service objects into its beans, butinjects a proxy object. The reference from the bean to the proxy remainsconstant, so the bean does not have to deal with the dynamics.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 113 / 174

Page 133: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Dynamics and Thread Safety

This swaps one problem – thread safety – for another: the beans usingthe service have no idea whether the service is presently available.

What happens when a bean calls the proxy and no backing service ispresent?

DM uses an (optional) timeout to wait for a suitable service to appear.

Ultimately it must throw an unchecked exception,ServiceUnavilableException.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 114 / 174

Page 134: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Listening to Services

This is nice and simple, but sometimes we really need to know thestate of the service. For example we might be able to offer alternativefunctionality when the backing service is unavailable.

E.g. when there is no LogService, print to the console.

For this we can nominate a bean as a service listener.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 115 / 174

Page 135: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Listening to Services

Service Listener

<osgi : reference id="importedLogSvc"

interface="org.osgi.service.log.LogService"><listener ref="log" bind−method="setLog"

unbind−method="unsetLog"/></osgi : reference>

<bean id="log" class="org... MyLog"/>

Note that the log bean declaration could be in the non-OSGi part of ourapplication context.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 116 / 174

Page 136: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Listening to Services

Just like DS with dynamic policy, the bind/unbind methods can becalled concurrently with other methods accessing the bean.

Therefore beans configured as listeners must be thread-safe.

There is no equivalent of static policy.

NB: when service replacement occurs, unbind is not called at all.Unbind is only called when the service is going away and there is noavailable replacement.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 117 / 174

Page 137: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Multiple References

The <reference> element is used for references to single services.For multiple services, there are two choices: <list> and <set>.

Each of these gives us a managed collection object which can beinjected as a constant bean into other beans.

List and Sets

<osgi : list id="listenerList"

interface="org.osgi.service.log.LogListener"/>

<osgi : set id="listenerSet"

interface="org.osgi.service.log.LogListener"/>

<bean id="log" class="org... MyLog"><property name="listeners" ref="listenerList"/>

</bean>

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 118 / 174

Page 138: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Multiple References

Spring-DM adds and removes service objects in this collectiontransparently.

A listener bean can be nominated, as with singular references.

Iterators over these collections are stable. If a call to hasNext returnstrue then the subsequent call to next is guaranteed to returnnon-null.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 119 / 174

Page 139: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Optional vs Mandatory Service References

Contents

13 Introduction

14 A Minimal Example

15 Activation and Deactivation

16 References to Services

17 Optional vs Mandatory Service References

18 Publishing Services

19 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 120 / 174

Page 140: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Optional vs Mandatory Service References

Mandatory Dependencies

Like DS, Spring-DM supports both optional and mandatory servicesvia a simple declaration.

Optional Service Reference

<osgi : reference id="logSvc" interface="org...log.LogService"

cardinality="0..1"/>

<osgi : list id="listeners" interface="org...log.LogListener"

cardinality="0..N"/>

The default cardinality can be controlled in the outer <beans>element, but the default default is 1..1 or 1..N, i.e. mandatory.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 121 / 174

Page 141: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Optional vs Mandatory Service References

Mandatory Dependencies

If there are any unsatisfied mandatory references, the entireapplication context will not start.

Obviously we cannot have a mandatory ref to a service exported bythe same application context!

If a mandatory reference becomes unsatisfied, the application contextis not deactivated and no active components will be deactivated.

Instead any service exports that depend on the reference (whetherdirectly or transitively) will be unregistered.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 122 / 174

Page 142: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Contents

13 Introduction

14 A Minimal Example

15 Activation and Deactivation

16 References to Services

17 Optional vs Mandatory Service References

18 Publishing Services

19 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 123 / 174

Page 143: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Publishing a Service

Any bean within the application context can be published as a service.

Simple Publication

<osgi : service ref="contacts" interface="net... ContactRepository"/>

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 124 / 174

Page 144: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

More Publication Options

<osgi : service ref="contacts"><osgi : interfaces>

<value>net . . . ContactRepository</value><value>net . . . EventHandler</value>

</osgi : interfaces></osgi : service>

<osgi : service ref="contacts" auto−export="interfaces"/>

<osgi : service ref="contacts" auto−export="interfaces"><osgi : service−properties>

<entry key="foo" value="bar"/></osgi : service−properties>

</osgi : service>

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 125 / 174

Page 145: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Lab 3 : Building the Directory Repository (Setup)

1 Install the Spring-DM bundles:

osgi> installDir . . / ComponentsSpringDM/bundles

2 Start the Spring-DM Extender bundle(org.springframework.osgi.extender...)

osgi> start 17INFO [ org . spring . . . ] − Starting . . .

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 126 / 174

Page 146: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Lab 3 : Building the Directory Repository

1 Complete the implementation of the DirectoryRepositoryDM class– TODO markers explain what is needed.

2 Complete the Spring XML descriptor osgi-context.xml in thespring directory. Add references to the log and listener services.

3 Complete context.xml in the same directory. Add properties wiredto the service reference beans. Declare the init and destroy methodson the main component bean.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 127 / 174

Page 147: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Lab 3 : Publishing as a Service

1 Publish the component under the ContactRepository interface.

2 Add the property name=Directory.

3 Test as before with the services command and in the Swing GUI.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 128 / 174

Page 148: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Contents

13 Introduction

14 A Minimal Example

15 Activation and Deactivation

16 References to Services

17 Optional vs Mandatory Service References

18 Publishing Services

19 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 129 / 174

Page 149: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Advantages of Spring-DM

Spring-DM is clearly the best approach for modularising an existingSpring-based application.

It provides a more mature Dependency Injection framework than DSwith features not present in DS (e.g. constructor injection).

Stronger focus on POJOs than DS.

Standardised in the OSGi compendium in R4.2 (the BlueprintService).

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 130 / 174

Page 150: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Disadvantages of Spring-DM

Heavy! Twelve JARs totalling 2.1Mb (DS is 170k)

The “application context” idea has been adapted to fit the OSGimodel and it feels like legacy. The result seems to be highercomplexity.

No separate bean life-cycle.

Lack of laziness.

A “standard” but will we ever see a competing implementation?

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 131 / 174

Page 151: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Lack Of Bean Life-cycle

Bundle with 2 Mandatory References

B

A

1..1

1..1

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 132 / 174

Page 152: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Lack Of Bean Life-cycle

Partially Satisfied

B

A

1..1

1..1

The App Context on the left will not be activated because onemandatory reference is missing.

However the individual bean A has no missing references.

Why not activate just A and the beans that use it?

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 133 / 174

Page 153: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Lack of Bean Life-cycle

When mandatory references become unsatisfied, Spring-DM avoidsdestroying the application context.

Beans that are “active” will not be deactivated. . . even if their“mandatory” references are unsatisfied!

Have to use service listeners if there is active state (e.g. a pollingthread) which must be deactivated when a referenced service goesaway.

Why does Spring-DM not deactivate the context? Probably because it isexpensive to recreate, rather than because it is the right thing to do.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 134 / 174

Page 154: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Lack of Laziness

The application context is created by the Spring-DM extender bundleas soon as our bundle enters ACTIVE state.

This causes classloading events, forcing the framework to create aclassloader for our bundle.

There does not appear to be a mechanism for deferring this activityuntil the published services are needed by a consumer.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 135 / 174

Page 155: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Part IV

Apache iPOJO

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 136 / 174

Page 156: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Contents

20 Introduction

21 A Minimal Example

22 Activation and Deactivation

23 References to Services

24 Dynamics and Thread-Safety

25 Publishing Services

26 Annotation-Based Declarations

27 iPOJO Handlers

28 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 137 / 174

Page 157: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Introduction

Apache iPOJO

iPOJO is a sub-project of Apache Felix, however it works on otherR4.1 frameworks.

Like Spring-DM it focuses on creating a pure POJO programmingmodel for components.

It supports individual “bean” component lifecycle.

Supports both XML and annotation-based metadata.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 138 / 174

Page 158: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Contents

20 Introduction

21 A Minimal Example

22 Activation and Deactivation

23 References to Services

24 Dynamics and Thread-Safety

25 Publishing Services

26 Annotation-Based Declarations

27 iPOJO Handlers

28 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 139 / 174

Page 159: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

A Minimal Example

Minimal iPOJO Declaration

< i p o j o><component name="hello" c l a s sname="org... HelloComponent"/>< i n s t a n c e component="hello"/>

</ i p o j o>

iPOJO separates the concepts of a component definition andcomponent instances.

The former is like a factory.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 140 / 174

Page 160: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

A Minimal Example

Running the Example

iPOJO is just one extender bundle, which must be installed and started:

org.apache.felix.ipojo-<version>.jar

BUT we need an additional build step – an ANT task whichpost-processes the bundle JAR. We sill see why this is necessary shortly.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 141 / 174

Page 161: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

Contents

20 Introduction

21 A Minimal Example

22 Activation and Deactivation

23 References to Services

24 Dynamics and Thread-Safety

25 Publishing Services

26 Annotation-Based Declarations

27 iPOJO Handlers

28 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 142 / 174

Page 162: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

Activation and Deactivation

Validate/Invalidate Callbacks

<ipojo><component classname="org... PollingComponent">

<callback transition="validate" method="start"/><callback transition="invalidate" method="stop"/>

</component>

<instance component="org... PollingComponent"/></ipojo>

Like Spring-DM, the activation method is zero-arg, so how areconfiguration properties set?

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 143 / 174

Page 163: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

Configuration Properties

Properties

<ipojo><component classname="org... PollingComponent">

<callback transition="validate" method="start"/><callback transition="invalidate" method="stop"/><properties>

<property name="period" field="period"/></properties>

</component>

<instance component="org... PollingComponent"><property name="period" value="2000"/>

</instance></ipojo>

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 144 / 174

Page 164: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Activation and Deactivation

Component Implementation

Receiving a Property

public class PollingComponent {

private int period ;

protected void start ( ) {// . . .

}

protected void stop ( ) {// . . .

}}

Direct injection into the private field!

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 145 / 174

Page 165: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Contents

20 Introduction

21 A Minimal Example

22 Activation and Deactivation

23 References to Services

24 Dynamics and Thread-Safety

25 Publishing Services

26 Annotation-Based Declarations

27 iPOJO Handlers

28 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 146 / 174

Page 166: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

References to Services

Referring to a service is done with similar magic. Just declare a privatefield with the type of the service, and use it!

Receiving a Service

public class PollingComponent {

private int period ;private LogService log ;

protected void start ( ) {if ( log != null )

log . log ( LogService . LOG_INFO , "Starting polling" ) ;// . . .

}

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 147 / 174

Page 167: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Declaring a Service Reference

<component classname="org... PollingComponent"><requires field="log"/>

. . .

</component>

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 148 / 174

Page 168: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

References to Services

Optional Service References

References are mandatory by default, to make optional:

<component classname="org... PollingComponent"><requires field="log" optional="true"/>

. . .

</component>

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 149 / 174

Page 169: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Dynamics and Thread-Safety

Contents

20 Introduction

21 A Minimal Example

22 Activation and Deactivation

23 References to Services

24 Dynamics and Thread-Safety

25 Publishing Services

26 Annotation-Based Declarations

27 iPOJO Handlers

28 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 150 / 174

Page 170: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Dynamics and Thread-Safety

Dynamic Services

Notice when we used the optional log service:

if ( log != null )log . log ( LogService . LOG_INFO , "Starting polling" ) ;

This is classic check-then-act, and looks completely unsafe!

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 151 / 174

Page 171: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Dynamics and Thread-Safety

Thread Safety

iPOJO “manages” the required synchronisation for us.

As soon as a method “touches” a dependency (i.e. an injected field) ,iPOJO ensures that these objects are kept until the end of themethod.

All iPOJO components therefore follow a dynamic policy as definedby DS.

But we can write our code without regard for thread-safety.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 152 / 174

Page 172: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Dynamics and Thread-Safety

Bytecode Instrumentation

Perhaps now you see what the additional build step is for.

iPOJO makes heavy use of bytecode instrumentation.

Methods are generated giving access to private fields.

Methods are inspected for access to shared variables, andsynchronization instructions inserted.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 153 / 174

Page 173: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Contents

20 Introduction

21 A Minimal Example

22 Activation and Deactivation

23 References to Services

24 Dynamics and Thread-Safety

25 Publishing Services

26 Annotation-Based Declarations

27 iPOJO Handlers

28 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 154 / 174

Page 174: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Publishing Services

Publishing is done with the <provides> element. In the simplest cases,just adding this element is all that is necessary:

Provides Element

<component classname="org... PollingComponent"><provides/>

</component>

This is like Spring-DM’s auto-export="interfaces". Reflection is usedto publish under all interfaces implemented by the component.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 155 / 174

Page 175: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Service Properties

Service properties are added to the provides element as follows:

Properties on Provides

<component classname="org... PollingComponent"><provides>

<property name="foo" type="string" value="bar"/><property name="period" field="period"/>

</provides></component>

Properties can be explicitly provided here, or sourced from fields in thecomponent.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 156 / 174

Page 176: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Lab 4 : Building the Directory Repository (Setup)

1 Install the iPOJO bundle:

osgi> installDir . . / ComponentsiPOJO/bundles

2 Start the iPOJO bundle (org.apache.felix.ipojo...)

osgi> start 5

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 157 / 174

Page 177: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Lab 4 : Building the Directory Repository

1 Complete the implementation of the DirectoryRepositoryiPOJOclass – TODO markers explain what is needed.

2 Complete the XML descriptorcore.contacts.directory ipojo.xml. Add the following:

I An optional reference to the log service.I A zero-to-many reference to the listener service.I Callbacks for the activate/deactivate methods.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 158 / 174

Page 178: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Publishing Services

Lab 4 : Publishing as a Service

1 Publish the component under the ContactRepository interface.

2 Add the service property name=Directory.

3 Test as before with the services command and in the Swing GUI.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 159 / 174

Page 179: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Annotation-Based Declarations

Contents

20 Introduction

21 A Minimal Example

22 Activation and Deactivation

23 References to Services

24 Dynamics and Thread-Safety

25 Publishing Services

26 Annotation-Based Declarations

27 iPOJO Handlers

28 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 160 / 174

Page 180: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Annotation-Based Declarations

Annotation-Based Declarations

As an alternative to XML, iPOJO supports annotations directly in thecomponent source code.

These annotations are retained in the compiled bytecode but not theruntime VM.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 161 / 174

Page 181: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Annotation-Based Declarations

Annotation-Based Declarations

MyCustomerDAO

@Component

@Provides

public class MyCustomerDAO implements CustomerDAO {@Requires

private DataSource dataSource ;

public Customer lookupCustomer ( String name ) {Connection conn = dataSource . getConnection ( ) ;// . . .

}

@Validate

public void starting ( ) { /∗ . . . ∗/ }

@Invalidate

public void stopping ( ) { /∗ . . . ∗/ }}

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 162 / 174

Page 182: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Annotation-Based Declarations

Annotation-Based Declarations

We can use annotations together with XML.

The annotations control the component definition (i.e. <component>element).

XML would then be used to produce instances.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 163 / 174

Page 183: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

iPOJO Handlers

Contents

20 Introduction

21 A Minimal Example

22 Activation and Deactivation

23 References to Services

24 Dynamics and Thread-Safety

25 Publishing Services

26 Annotation-Based Declarations

27 iPOJO Handlers

28 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 164 / 174

Page 184: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

iPOJO Handlers

iPOJO Handlers

DS and Spring-DM use a “monolithic container”, i.e. all the aspectsof component control (service refs, service provides, configuration,life-cycle) are implemented in one indivisible runtime (the SCR orSpring-DM extender).

iPOJO separates these tasks into individual handlers.

Handlers are provided out of the box for the common use-cases (refs,provides, etc.).

We can extend the behaviour of iPOJO with custom handlers.

Example: JMX instrumentation of component state.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 165 / 174

Page 185: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Contents

20 Introduction

21 A Minimal Example

22 Activation and Deactivation

23 References to Services

24 Dynamics and Thread-Safety

25 Publishing Services

26 Annotation-Based Declarations

27 iPOJO Handlers

28 Advantages and Disadvantages

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 166 / 174

Page 186: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Advantages of iPOJO

Very clean POJO coding style for components.

Extreme flexibility through handlers.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 167 / 174

Page 187: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Disadvantages of iPOJO

Bytecode engineering and extensive annotations: are these really stillPOJOs??

Is the blanket promise to “handle concurrency” really credible?

Additional build steps.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 168 / 174

Page 188: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Thread-Safety

Yes, thread-safety is easy to screw up, and Java offers weak supportfor getting it right. Worse, too many Java programmers areunaccustomed to concurrent programming. Remember, J(2)EEliterally forbids the use of threads.

Is the solution to delegate to a container?

No. Truly re-usable components should not rely on a specialcontainer to make them robust, they should be internally robust.

Well-written DS components are safe in almost any context. iPOJOcomponents are only safe in iPOJO or a non-threaded environment.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 169 / 174

Page 189: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Thread-Safety

Yes, thread-safety is easy to screw up, and Java offers weak supportfor getting it right. Worse, too many Java programmers areunaccustomed to concurrent programming. Remember, J(2)EEliterally forbids the use of threads.

Is the solution to delegate to a container?

No. Truly re-usable components should not rely on a specialcontainer to make them robust, they should be internally robust.

Well-written DS components are safe in almost any context. iPOJOcomponents are only safe in iPOJO or a non-threaded environment.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 169 / 174

Page 190: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Thread-Safety

Yes, thread-safety is easy to screw up, and Java offers weak supportfor getting it right. Worse, too many Java programmers areunaccustomed to concurrent programming. Remember, J(2)EEliterally forbids the use of threads.

Is the solution to delegate to a container?

No. Truly re-usable components should not rely on a specialcontainer to make them robust, they should be internally robust.

Well-written DS components are safe in almost any context. iPOJOcomponents are only safe in iPOJO or a non-threaded environment.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 169 / 174

Page 191: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Advantages and Disadvantages

Thread-Safety

Yes, thread-safety is easy to screw up, and Java offers weak supportfor getting it right. Worse, too many Java programmers areunaccustomed to concurrent programming. Remember, J(2)EEliterally forbids the use of threads.

Is the solution to delegate to a container?

No. Truly re-usable components should not rely on a specialcontainer to make them robust, they should be internally robust.

Well-written DS components are safe in almost any context. iPOJOcomponents are only safe in iPOJO or a non-threaded environment.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 169 / 174

Page 192: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Part V

Conclusion

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 170 / 174

Page 193: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Component Model Interoperability

Contents

29 Component Model Interoperability

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 171 / 174

Page 194: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Component Model Interoperability

Component Model Interoperability

Great News!

All of the discussed component models for OSGi (and others e.g. Peaberryfor Google Guice) interoperate perfectly at the services level!

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 172 / 174

Page 195: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Component Model Interoperability

Component Model Interoperability

We can easily use a Spring-DM with DS or iPOJO bundles on either side:

Exporting and Importing a Bean

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 173 / 174

Page 196: OSGi DevCon 09 - Component Oriented Development in OSGi with DS, Spring and iPOJO

Component Model Interoperability

Component Model Interoperability

In all cases, the imported and exported artefacts are just services.

The use of DS, Spring-DM etc. can be considered merely animplementation detail of each bundle.

We are not stuck with our choice of component model until the endof time!

We can use third party components developed using other componentmodels.

c© 2009 Neil Bartlett & WeigleWilczek GmbH. Released under the Eclipse Public License v1.0. March 24, 2009 174 / 174