La migliore tecnica per ottenere il contesto del bundle OSGi?

Ogni bundle nel mio progetto OSGi ha il proprio BundleActivator, che a mio avviso è normale. Questo viene passato all’attuale BundleContext, che è utile avere in giro per ottenere riferimenti di servizio e quant’altro.

Tuttavia, dalle classi nel mio pacchetto, come posso ottenere BundleContext? Assegnarlo a un campo statico pubblico nel BundleActivator fa schifo e passarlo come argomento fa schifo. C’è un modo più intelligente?

È ansible utilizzare FrameworkUtil.getBundle(ClassFromBundle).getBundleContext() .

Vedi FrameworkUtil JavaDoc .

Una buona pratica nello sviluppare bundle OSGi, a mio parere, è cercare di scrivere il codice relativo a OSGi il più centralizzato ansible. In questo modo, se si desidera utilizzare il codice in un ambiente non OSGi, lo sforzo di migrazione è minimo.

Pertanto, l’utilizzo di riferimenti statici o FrameworkUtil in tutto il luogo non è una buona idea imho. Né si sta utilizzando un normale OSGi. Prova a guardare iPOJO o Servizi dichiarativi.

Un’altra alternativa è l’uso dei Servizi dichiarativi, che ti consente di ricevere BundleContext nel tuo metodo di triggerszione. Ad esempio, supponendo che tu usi Bnd Annotations per DS:

 @Activate public void activate(BundleContext context) { // ... } 

Tuttavia, come ha detto RaduK, è molto meglio se puoi scrivere la maggior parte del tuo codice in stile POJO senza utilizzare API OSGi come BundleContext.

Non c’è magia qui. Hai bisogno di un modo per fornire le informazioni alle altre classi. Quindi è disponibile tramite lo stack di chiamate o in qualche posto ben noto (ad esempio, statico).