2011-11-30 9 views
5

Utilizzando lo Spring-Context MANIFEST definitions, sto cercando di eseguire un component-scan per cercare pacchetti per i bean con annotazione Spring. La mia configurazione XML Spring è simile a questa:Componente scansione a primavera in OSGi non trova nulla

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
     http://www.osgi.org/xmlns/blueprint/v1.0.0 http://www.osgi.org/xmlns/blueprint/v1.0.0/blueprint.xsd"> 

    <!-- Scans the classpath of this application for @Components to deploy as 
     beans --> 
    <context:component-scan 
     base-package="com.some.other.module.one,com.another.module.two" /> 

    <context:annotation-config /> 
.... 

</beans> 

Nel MANIFEST, importare i pacchetti contenenti le classi con le annotazioni Spring. Tuttavia, quando ispeziono ApplicationContext, non contiene nessuno dei bean annotati.

Credo che stia accadendo perché i percorsi di classe che stiamo analizzando sono in bundle diversi. Questi bundle non importano direttamente i pacchetti con le classi che contengono annotazioni Spring. Qual è la confusione del motivo per cui Spring non preleva il classpath del bundle principale da cui è partito il componente-scan? Sembra che stia utilizzando il classpath di ogni pacchetto quando esegue una scansione del classpath. Esiste un modo per ottenere che la scansione del percorso di classe utilizzi il classpath del pacchetto in cui inizia la scansione? .

Modifica

Come detto Danail Nachev seguito, quando Spring esegue la scansione classpath, avviene solo all'interno del modulo che il percorso di classe sta succedendo nel aggirare è quello di utilizzare:

  1. Inserisci le tue configurazioni per modulo in un bean Spring 3 @Configuration.
  2. Utilizzare un file XML nel bundle di livello superiore che inizializza il bean @Configuration.
  3. Nel bean di livello superiore @Configuration utilizzare @Import per importare gli altri file di configurazione.
  4. Assicurati di Require-Bundle nel MANIFEST per verificare che la configurazione che stai importando sia disponibile.

risposta

7

OSGi significa essere modulare, quindi è molto importante avere una netta separazione tra i pacchetti. Se Spring può andare e riunirli in un singolo ApplicationContext, non sarà diverso dal solito Spring application, dove tutto è disponibile in single classpath. Qualcosa come questo.

Quello che succede è che ogni pacchetto riceve il proprio ApplicationContext. Questi ApplicationContexts possono scambiare i bean utilizzando il registro del servizio OSGi. È necessario contrassegnare i bean esportati e importarli in altri ApplicationContexts, altrimenti non sono visibili l'uno con l'altro.

Questo dovrebbe spiegare perché non è possibile configurare tutto con un singolo contesto di Spring e ci si aspetta che partendo da un unico pacchetto, esso vada a trovare tutti i bean. Il contesto Spring analizza solo il singolo bundle e facoltativamente può importare/esportare i bean come servizi OSGi.

interpretato da qui: Chapter 8. Packaging and Deploying Spring-based OSGi applications

+0

Grazie, questo è esattamente il comportamento che è stato osservato. Sono riuscito a trovare una soluzione alternativa senza utilizzare una scansione del classpath. –