2014-05-01 7 views
5

Secondo HK2 @Service javadocIn che modo ServiceLocator trova @Service e @Contact automaticamente in HK2?

nota posizionato sulle classi che devono essere automaticamente aggiunti a un ServiceLocator hk2.

Non so come rendere ServiceLocator trovare automaticamente le classi annotate.

TestService

@Contract 
public interface TestService { 

} 

TestServiceImpl

@Service 
public class TestServiceImpl implements TestService { 

} 

principale

public static void main(String[] args) { 
    ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator(); 

    TestService service = locator.getService(TestServiceImpl.class);  
    System.out.println(service); // null 
} 

Il risultato è sempre puntuale s null. Devo aggiungere Descriptor in modo che lo ServiceLocator possa trovarlo.

public static void main(String[] args) { 
    ServiceLocator locator = ServiceLocatorUtilities.createAndPopulateServiceLocator(); 

    DynamicConfigurationService dcs = locator.getService(DynamicConfigurationService.class); 
    DynamicConfiguration config = dcs.createDynamicConfiguration(); 
    config.bind(BuilderHelper.link(TestServiceImpl.class).to(TestService.class).in(Singleton.class).build()); 
    config.commit(); 

    TestService service = locator.getService(TestServiceImpl.class);  
    System.out.println(service); // TestServiceImpl instance 
} 

Come posso lascio ServiceLocator trovare automaticamente le classi annotate? Ho frainteso qualcosa?

risposta

5

È necessario eseguire lo hk2-inhabitant-generator sulle classi costruite per ottenere il rilevamento automatico dei servizi. Vi sono altre informazioni here.

Cosa fa questo passaggio nel processo di compilazione è creare un file denominato META-INF/hk2-locator/default con informazioni sui servizi. La chiamata createAndPopulateServiceLocator quindi legge quei file e aggiunge automaticamente tali descrittori di servizio nel ServiceLocator restituito.

+2

Come aggiornamento a questo c'è anche ora un generatore di metadati hk2 più facile da usare. Tutto quello che devi fare è metterlo nel tuo classpath. Maggiori informazioni qui: https://hk2.java.net/2.4.0-b16/inhabitant-generator.html – jwells131313

+0

Non correlate a questa risposta in particolare, ma sto facendo qualche ricerca su HK2 da alcuni giorni e ogni volta che trovo una risposta i collegamenti alle informazioni reali/aiuto atterrano sempre su questa pagina iniziale https://javaee.github.io/hk2/ che è una specie di non utile :( – A4L

5

FYI, ero così frustrato con la dipendenza dei file abitante piuttosto che avere la capacità di runtime la scansione di classi annotate, ho scritto questo progetto:

https://github.com/VA-CTT/HK2Utilities

Dal Eclipse/Maven/runtime abitante i generatori non giocavano bene, era quasi impossibile eseguire il debug del codice che utilizzava HK2 in Eclipse senza la scansione runtime.

Il pacchetto HK2Utilities è disponibile nel centro:

<dependency> 
    <groupId>gov.va.oia</groupId> 
    <artifactId>HK2Utilities</artifactId> 
    <version>1.4.1</version> 
</dependency> 

Per usarlo, basta chiamare:

ServiceLocator locator = HK2RuntimeInitializer.init("myName", false, new String[]{"my.package.one", "my.package.two"}); 

Questo esegue la scansione del percorso di classe runtime per le classi nei pacchetti elencati, e automaticamente popolare il localizzatore di servizi con loro.

Non è mai necessario generare file di residenti con questo modello e, in pratica, ho trovato che sia più veloce rispetto al codice di elaborazione degli abitanti (non che le prestazioni siano importanti per questa operazione singola)

+0

Vorrebbe essere in grado di upvotare più volte. per HK2Utilities! – zyexal

+0

wow questo è così gr8. Considereresti eventualmente di contribuire a hk2 stesso? – jwells131313

+0

Sarei felice, ma non sono sicuro se fosse il genere di cosa che era voluto nel pacchetto HK2 leggero - richiama anche un'altra dipendenza che effettivamente esegue la scansione delle annotazioni. Può essere un po 'finché non trovo abbastanza cicli liberi da mettere insieme una richiesta di pull. – user2163960

Problemi correlati