Nel mio progetto, sto cercando di migrare tutti gli usi diPrimavera cablaggio per tipo è più lento da grandezza di cablaggio per nome
Foo foo = (Foo) beanFactory.getBean("name");
in
Foo foo = beanFactory.getBean(Foo.class);
I vantaggi sono evidenti: la sicurezza di tipo, codice meno contorto, costanti meno inutili, ecc. In genere tali linee sono situate in contesti legacy statici dove tale cablaggio è l'unica opzione.
Questo andava tutto bene fino a quando un giorno gli utenti hanno cominciato a lamentarsi della lentezza che si è presentata dagli interni di Spring. Così ho sparato un profiler per trovare un hotspot in
org.springframework.beans.factory.support.AbstractBeanFactory::doGetBean(String, Class<T>, Object[], boolean)
che ha una chiamata costosa per
Class.isAssignableFrom(anotherClass)
.
mi hanno rapidamente creato una piccola performance test per scoprire la differenza di velocità tra il nome di stringa e di tipo lookup è una convulsa volte (sto usando StaticApplicationContext
per questo test FAIW)!
Durante l'indagine, ho trovato SPR-6870 che ha un numero elevato di voti ma per qualche motivo non viene risolto. Questo mi ha portato a an attempt to solve this problem che migliora in modo significativo la situazione, ma è ancora più lenta ~ 25 volte rispetto alla ricerca di String! Si scopre che questo tentativo risolve solo metà del problema: memorizza nella cache il nome del bean per salvare su O (n) iterazione, ma deve comunque chiamare lo isAssignableFrom
per convalidare il tipo.
Il problema descritto non è solo relativo al mio scenario ma è anche per i bean che utilizzano @Autowired
e può essere sentito duro nei casi in cui i bean vengono creati all'interno di un ciclo.
Una delle soluzioni sarebbe quella di sovrascrivere uno dei metodi di bean factory e memorizzare i risultati del controllo is-this-bean-of-the-type dello stesso tipo, ma chiaramente questo dovrebbe essere fatto in primavera e non nel mio codice.
Qualcun altro soffre di un problema simile e ha trovato una soluzione?
Quindi, si desidera eseguire la registrazione automatica per tipo, ma senza eseguire alcun tipo di controllo? – GreyBeardedGeek
Voglio la seconda chiamata contro lo stesso tipo per evitare il costoso controllo dei tipi. O almeno voglio la possibilità di specificare se è abilitato o disabilitato. La creazione di oggetti è una cosa così basilare che piccole ottimizzazioni come questa possono fare una grande differenza. – mindas