Spring Dynamic Modules – dostęp do kontekstu pakunku (BundleContext)

Zasadniczo beany nie powinny być świadome tego, że są uruchomione w środowisku OSGi. Jeśli jednak mimo to potrzebujemy dostępu do kontekstu pakunku to są co najmniej cztery sposoby na jego uzyskanie

  • wykorzystanie metody org.osgi.framework.FrameworkUtil.getBundle(Class<?> classFromBundle) do pobrania obiektu Bundle reprezentującego pakunek OSGi i pobranie kontekstu metodą org.osgi.framework.Bundle.getBundleContext(). Jako ciekawostkę dodam, że aktualna implementacja pierwszej z tych metod wygląda w Equinoxie następująco
    /**
     * Return a {@code Bundle} for the specified bundle class. The returned
     * {@code Bundle} is the bundle associated with the bundle class loader
     * which defined the specified class.
     * 
     * @param classFromBundle A class defined by a bundle class loader.
     * @return A {@code Bundle} for the specified bundle class or
     *         {@code null} if the specified class was not defined by a
     *         bundle class loader.
     * @since 1.5
     */
    public static Bundle getBundle(final Class<?> classFromBundle) {
       // We use doPriv since the caller may not have permission
       // to call getClassLoader.
       Object cl = AccessController
             .doPrivileged(new PrivilegedAction<Object>() {
          public Object run() {
             return classFromBundle.getClassLoader();
          }
       });
    
       if (cl instanceof BundleReference) {
          return ((BundleReference) cl).getBundle();
       }
       return null;
    }
    
  • zaimplementowanie w beanie interfejsu org.springframework.osgi.context.BundleContextAware
  • kontekst aplikacji OSGi stworzony przez Spring extender automatycznie zawiera bean typu BundleContext o nazwie bundleContext który możemy wstrzyknąć do naszego beana
    <bean id="beanId" class="beanClass">
       <property name="bundleContext" ref="bundleContext" />
    </bean>
    
  • ostatnim (i najgorszym) rozwiązaniem jest zapamiętanie referencji na kontekst przekazanej do aktywatora pakunku w statycznym polu i udostępnienie go przez akcesor

Skomentuj

Wprowadź swoje dane lub kliknij jedną z tych ikon, aby się zalogować:

Logo WordPress.com

Komentujesz korzystając z konta WordPress.com. Log Out / Zmień )

Zdjęcie z Twittera

Komentujesz korzystając z konta Twitter. Log Out / Zmień )

Facebook photo

Komentujesz korzystając z konta Facebook. Log Out / Zmień )

Google+ photo

Komentujesz korzystając z konta Google+. Log Out / Zmień )

Connecting to %s