Google Guice vs. PicoContainer per Dependency Injection


100

Il mio team sta ricercando framework di iniezione delle dipendenze e sta cercando di decidere tra l'utilizzo di Google-Guice e PicoContainer.

Stiamo cercando diverse cose nel nostro framework:

  1. Una piccola impronta di codice - Quello che intendo per una piccola impronta di codice è che non vogliamo avere rifiuti di codice di iniezione di dipendenza ovunque nella nostra base di codice. Se dobbiamo eseguire il refactoring lungo la strada, vogliamo che sia il più semplice possibile.
  2. Prestazioni: quanto overhead ha ogni framework durante la creazione e l'inserimento di oggetti?
  3. Facilità di utilizzo - C'è una grande curva di apprendimento? Dobbiamo scrivere montagne di codice per far funzionare qualcosa di semplice? Vogliamo avere la minor configurazione possibile.
  4. Dimensioni della comunità: comunità più grandi di solito significano che un progetto continuerà a essere mantenuto. Non vogliamo utilizzare un framework e dobbiamo correggere i nostri bug;) Inoltre, qualsiasi domanda che abbiamo lungo il percorso può (si spera) trovare risposta dalla comunità di sviluppatori / utenti del framework.

Sarebbe molto apprezzato il confronto dei due quadri con i criteri elencati. Anche qualsiasi esperienza personale che aiuti a confrontare i due sarebbe estremamente utile.

Dichiarazione di non responsabilità: sono abbastanza nuovo nell'iniezione di dipendenza, quindi scusa il mio non-essere se ho posto una domanda che non è pertinente a questa discussione.


Aggiornamento: potresti anche prendere in considerazione CDI 2.0 - Contexts & Dependency Injection per Java . Standardizzato in JSR 365 a partire dal 2017-04.
Basil Bourque

Risposte:


115

Potresti voler includere Spring nell'elenco dei framework di Dependency Injection che stai prendendo in considerazione. Ecco alcune risposte alle tue domande:

Accoppiamento al quadro

Pico - Pico tende a scoraggiare l'iniezione di setter, ma a parte questo, le tue classi non hanno bisogno di sapere di Pico. È solo il cablaggio che deve sapere (vero per tutti i framework DI).

Guice - Guice ora supporta le annotazioni JSR 330 standard , quindi non sono più necessarie annotazioni specifiche Guice nel codice. Spring supporta anche queste annotazioni standard. L'argomento usato dai ragazzi di Guice è che senza un processore di annotazioni Guice in esecuzione, questi non dovrebbero avere un impatto se decidi di utilizzare un framework diverso.

Spring - Spring mira a consentire di evitare qualsiasi menzione del framework Spring nel codice. Poiché hanno molti altri helper / utilità ecc., La tentazione è piuttosto forte di dipendere dal codice Spring, però.

Prestazione

Pico - Non ho molta familiarità con le caratteristiche di velocità di Pico

Guice - Guice è stato progettato per essere veloce e il confronto menzionato nella referenza ha dei numeri. Certamente, se la velocità è una considerazione primaria, è opportuno considerare l'uso di Guice o il cablaggio manuale

Primavera : la primavera può essere lenta. C'è stato del lavoro per renderlo più veloce e l'uso della libreria JavaConfig dovrebbe accelerare le cose.

Facilità di utilizzo

Pico - Semplice da configurare. Pico può prendere alcune decisioni sui cavi automatici per te. Non è chiaro come si ridimensiona a progetti molto grandi.

Guice - Semplice da configurare, devi solo aggiungere annotazioni ed ereditare da AbstractModule per legare le cose insieme. Si adatta bene a progetti di grandi dimensioni poiché la configurazione è ridotta al minimo.

Spring : relativamente facile da configurare, ma la maggior parte degli esempi utilizza Spring XML come metodo di configurazione. I file XML Spring possono diventare molto grandi e complessi nel tempo e richiedere tempo per il caricamento. Prendi in considerazione l'utilizzo di una miscela di Spring e iniezione di dipendenza a manovella per superare questo problema.

Dimensione della comunità

Pico - Piccolo

Guice - Medio

Primavera - Grande

Esperienza

Pico - Non ho molta esperienza con Pico ma non è un framework ampiamente utilizzato, quindi sarà più difficile trovare risorse.

Guice - Guice è un framework popolare e la sua attenzione alla velocità è benvenuta quando hai un progetto di grandi dimensioni che stai riavviando molto in fase di sviluppo. Ho una preoccupazione per la natura distribuita della configurazione, cioè non è facile vedere come è messa insieme l'intera applicazione. È un po 'come l'AOP sotto questo aspetto.

Primavera - La primavera è solitamente la mia scelta predefinita. Detto questo, l'XML può diventare macchinoso e il conseguente rallentamento fastidioso. Spesso finisco per usare una combinazione di Dependency Injection e Spring artigianali. Quando hai effettivamente bisogno di una configurazione basata su XML, Spring XML è abbastanza buono. Spring si è impegnata molto anche per rendere altri framework più compatibili con l'inserimento delle dipendenze, il che può essere utile perché spesso utilizzano le migliori pratiche quando lo fanno (JMS, ORM, OXM, MVC ecc.).

Riferimenti


1
Quello che ho imparato (da qualcun altro piuttosto che dall'usarlo io stesso) è che PicoContainer è più leggero di Guice. Inoltre, guardando il documento PicoContainer sembra anche essere più semplice da usare. Cercherà le dipendenze nei costruttori stessi e non è necessario specificare quale costruttore utilizzare. Ne usa solo uno corrispondente.
Kissaki

2
Sì, adesso sono grande su PicoContainer. È solo una tale soluzione "mantienila semplice", ma funzionante, non posso fare a meno di guardare la primavera come gonfia e obsoleta al giorno d'oggi. Guice è anche carino (e ha un buon sostenitore con Google), ma credo che Pico abbia anche più funzionalità / flessibilità, essendo più vecchio. È bello vedere buone alternative alla pessima configurazione xml!
Manius

In riferimento alla descrizione "non ampiamente utilizzata" di Pico sopra, è vero che non è popolare come le altre, ma considerando che è più piccola / più semplice di altre soluzioni è molto meno probabile che si verifichino problemi insoliti. Se lo fai, c'è una mailing list carina e molto reattiva. Inoltre Pico non è invasivo (a meno che tu non decida di utilizzare le annotazioni, è un'opzione), non hai bisogno di annotazioni come Guice, il che significa meno lavoro per il cablaggio del codice di iniezione. (sì, sono di parte, ma Pico è proprio così figo) Guice è certamente un buon strumento DI (meglio di Spring IMO), però.
Manius

1
Uso pico in una serie di progetti molto grandi (e di uso intenso) (centinaia di tipi di componenti definiti in ciascun contenitore) e ho utilizzato la maggior parte delle sue varie funzionalità e non potrei esserne più soddisfatto.
jhouse

2
Ho appena eseguito un semplice test delle prestazioni con Guice / Spring / PicoContainer: Guice e PicoContainer sono abbastanza simili. In alcuni casi Guice è stato un po 'più veloce. La primavera è stata molto lenta in tutti i casi.
Joshua Davis

25

La risposta fornita da jamie.mccrindle è in realtà piuttosto buona, ma sono rimasto confuso sul motivo per cui Spring è la scelta predefinita quando è abbastanza chiaro che sono disponibili alternative superiori (sia Pico che Guice). La popolarità di IMO Spring ha raggiunto il suo apice e ora sta attualmente vivendo del clamore generato (insieme a tutti gli altri sottoprogetti di primavera "anche io" che cercano di cavalcare il carro della primavera).

L'unico vero vantaggio della primavera è la dimensione della comunità (e francamente, a causa delle dimensioni e della complessità, è necessaria), ma Pico e Guice non hanno bisogno di una grande comunità perché la loro soluzione è molto più pulita, più organizzata e più elegante. Pico sembra più flessibile di Guice (puoi usare le annotazioni in Pico o no - è estremamente efficiente). (Modifica: intendeva dire che è estremamente flessibile, non che non sia anche efficiente.)

Le dimensioni ridotte di Pico e la mancanza di dipendenze sono una vittoria PRINCIPALE che non dovrebbe essere sottovalutata. Quanti mega devi scaricare per usare Spring adesso? È un pasticcio di enormi file jar, con tutte le sue dipendenze. Pensando in modo intuitivo, una soluzione così efficiente e "piccola" dovrebbe scalare e funzionare meglio di qualcosa come Spring. Il gonfiore della primavera lo farà davvero scalare meglio? È questo mondo bizzarro? Non darei per scontato che Spring sia "più scalabile" fino a quando non sarà provato (e spiegato).

A volte creare qualcosa di buono (Pico / Guice) e poi tenerlo lontano da esso invece di aggiungere funzioni gonfie e lavello da cucina con infinite nuove versioni funziona davvero ...


1
Vuoi dire perché Pico e Guice sono superiori alla primavera?
Thorbjørn Ravn Andersen

4
Pensavo di averlo fatto - in pratica, fanno altrettanto bene, sono più semplici / più piccoli / più puliti e nessuna o poche dipendenze. Questo non vuol dire che la primavera non abbia mai senso (sono sicuro che ci sono casi), tutto quello che sto dicendo è che più semplice è meglio se i tuoi requisiti vengono soddisfatti. E per un numero molto elevato di progetti, bastano piccole librerie di supporto.
Manius

12

NOTA: questo è più un commento / rant che una risposta

PicoContainer è fantastico. Ritornerei ad esso se solo sistemassero i loro siti web. È davvero confuso ora:

  • http://picocontainer.com che è il più recente, ma molte pagine hanno problemi di formattazione e alcune pagine non funzionano affatto. Sembra che le pagine siano state convertite automaticamente dal contenuto precedente.
  • http://picocontainer.codehaus.org/ Che sembra congelato nel tempo alla versione 2.10.2 - Sarebbe davvero bello se le pagine dicessero qualcosa come "ehi, stai guardando un vecchio sito web!"
  • http://docs.codehaus.org/display/PICO/Home - Un wiki di confluenza che documenta la v 1.x, ma non lo dice da nessuna parte sulle pagine!

Sto usando Guice 2.x ora, anche se è più grande e ha meno funzioni. È stato molto più facile trovare la documentazione e il suo gruppo di utenti è molto attivo. Tuttavia, se la direzione di Guice 3 è indicativa, sembra che Guice stia iniziando a gonfiarsi, proprio come la primavera nei primi giorni.

Aggiornamento: ho pubblicato un commento ai ragazzi di Pico Container e hanno apportato alcuni miglioramenti al sito web. Molto meglio ora!


Ma il sito web di Codehaus è ancora bloccato e nessuna informazione su qualsiasi mossa. Pensavo che Pico fosse morto;)
Vladislav Rastrusny

1
Se il sito web non è aggiornato con il codice, potrebbe essere un'indicazione che il progetto è sceso al di sotto della massa critica.
Thorbjørn Ravn Andersen

@ ThorbjørnRavnAndersen Sì. Purtroppo penso che Pico sia stato sostituito da Guice e CDI.
Joshua Davis

5
Dall'8 marzo 2013, il sito web picocontainer.org sembra essere occupato da uno squatter di dominio. picocontainer.com sembra essere il sito web canonico ora.
dOxxx

2

È una vecchia domanda ma oggi puoi considerare Dagger ( https://github.com/square/dagger ) nel tuo progetto di app Android. Dagger genera codice durante la compilazione. In questo modo si ottiene un tempo di avvio più breve e un minore utilizzo della memoria durante il tempo di esecuzione.


Mi piace Dagger, ma sembra che non ci sia ancora un plug-in Gradle nei repository pubblici per progetti non Android (ovvero un plug-in Gradle per progetti java "normali"). Lo prenderei in considerazione per i progetti Java se ci fosse un plugin nei repository pubblici.
Joshua Davis

2

Se stai cercando un contenitore DI minimalista, puoi dare un'occhiata a Feather . Funzionalità solo Vanilla JSR-330 DI, ma abbastanza buona in termini di footprint (16K, nessuna dipendenza) e prestazioni. Funziona su Android.


Ehi, Feather è fantastica! L'ho usato per implementare un plugin DI per ActFramework . Ho fatto alcuni aggiornamenti, ad esempio, chiama automaticamente injectFields se necessario e supporto per l'ascoltatore di iniezione, fammi sapere se vuoi che rispedisca una richiesta di pull
Gelin Luo

@green Vedo che ti sei trasferito a Genie. Potresti condividere le tue esperienze di utilizzo di Feather?
beerBear

1
@beerBear Feather è molto leggero e molto facile da usare nella maggior parte dei casi d'uso DI. Tuttavia, poiché sto lavorando su un framework MVC fullstack, ho bisogno di una soluzione che implementa le specifiche JSR330 complete. Ecco perché mi sono trasferito a Genie
Gelin Luo il

@green Apprezzo il tuo post della spiegazione per avere una migliore comprensione.
beerBear

0

Anche se mi piace PicoContainer per la sua semplicità e per la mancanza di dipendenze. Consiglierei invece di usare CDI perché fa parte dello standard Java EE, quindi non hai vincoli al fornitore.

In termini di invadenza, il problema principale è il requisito di un contenitore e l'uso di un file META-INF / bean.xml relativamente vuoto (necessario per indicare che il jar utilizza CDI) e l'uso di annotazioni (sebbene siano standard )

Il container CDI leggero che utilizzo per i miei progetti è Apache Open Web Beans. Anche se ci è voluto un po 'per capire come creare un'app semplice (a differenza di Pico) che assomiglia a questa.

public static void main(final String[] args) {
    final ContainerLifecycle lifecycle = WebBeansContext.currentInstance()
            .getService(ContainerLifecycle.class);
    lifecycle.startApplication(null);

    final BeanManager beanManager = lifecycle.getBeanManager();
    // replace Tester with your start up class
    final Bean<?> bean = beanManager.getBeans(Tester.class).iterator()
            .next();

    final Tester b = (Tester) lifecycle.getBeanManager().getReference(bean,
            Tester.class, beanManager.createCreationalContext(bean));
    b.doInit();
}

2
Se ti attieni a JSR-330 nel codice della libreria, puoi ridurre al minimo il codice specifico del contenitore.
Thorbjørn Ravn Andersen

Hai ancora bisogno del codice specifico del contenitore nei test automatizzati. Anche se ciò non significa che avresti un codice specifico del contenitore nel tuo codice effettivo (e non dovresti comunque a meno che tu non abbia intenzione di eseguire il tuo "main" che ho fatto in un'app che ho scritto per me stesso.
Archimedes Trajano
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.