Cheat Sheet

Injecting a Managed Bean

@Inject
private IceCreamService iceCream;

Disambiguating Injection Points for Managed Beans

@Inject @Chocolate
private IceCreamService iceCream;

Selecting Beans at Run-Time

@Inject @Any
private Instance<IceCreamService> anyIceCream;

public void printFlavours() {
    for (IceCreamService iceCream : anyIceCream) {
        System.out.println(iceCream.getFlavour());
    }
}

Injecting an OSGi Service

@Inject @OsgiService
private IceCreamService iceCream;

Disambiguating OSGi Services

@Inject @OsgiService(filter = "(&(flavour=chocolate)(lactose=false))")
private IceCreamService iceCream;

Selecting OSGi Services at Run-Time

@Inject
@OsgiService(dynamic = true)
private Instance<IceCreamService> iceCreamServices;

A filter member may be added to the @OsgiService annotation to narrow down the set of matching OSGi services.

Instance<T> implements Iterable<T>, so to iterate over all matching services, simply write:

for (IceCreamService iceCreamService : iceCreamServices) {
    // ...
}

Publishing a Bean as OSGi Service with singleton scope

@OsgiServiceProvider
public class ChocolateService implements IceCreamService {

}

By default, the service bean has CDI scope @SingletonScoped and the corresponding OSGi service is published with singleton scope. The @SingletonScoped annotation is optional.

Publishing a Bean as OSGi Service with bundle scope

Since Pax CDI 0.9.0

@OsgiServiceProvider
@BundleScoped
public class ChocolateService implements IceCreamService {

}

Publishing a Bean as OSGi Service with prototype scope

Since Pax CDI 0.9.0

@OsgiServiceProvider
@PrototypeScoped
public class ChocolateService implements IceCreamService {

}

Prototype scope is only supported when running on OSGi 6.0 or higher.

Setting OSGi Service Properties

@OsgiServiceProvider
@Properties({
    @Property(name = "flavour", value = "chocolate"),
    @Property(name = "lactose", value = "false")
})
public class ChocolateService implements IceCreamService {

}

Publishing an OSGi Service with Explicit Interfaces

@OsgiServiceProvider(classes = {ChocolateService.class, IceCreamService.class})
public class ChocolateService implements IceCreamService {

}