Domanda

Uso la primavera da un po 'di tempo, ma mi sono sempre chiesto come funziona, in particolare, come caricano e tessono i bean / le classi contrassegnate solo con un'interfaccia o @annotation .

Per le dichiarazioni XML, è facile vedere come Spring elabora i miei bean (sono dichiarati nel contesto XML che legge Spring), ma per le classi contrassegnate solo da annotazioni, non riesco a vedere come funziona, dal momento che non passare alcun agente a jvm o giù di lì.

Credo che ci sia un hook Java / JVM che ti consente di preelaborare le classi secondo una sorta di criteri, ma non sono riuscito a scoprire nulla sui documenti.

Qualcuno può indicarmi alcuni documenti? È correlato all'API java.lang.instrument.ClassFileTransformer ?

È stato utile?

Soluzione

In realtà per impostazione predefinita Spring no eseguire qualsiasi postprocessing bytecode né per XML, né bean configurati con annotazioni. Anziché i bean rilevanti sono avvolti in dinamici proxy (vedi ad es. java.lang.reflect.Proxy in Java SDK). I proxy dinamici avvolgono il oggetti reali che usi e intercetti il metodo chiama, consentendo di applicare AOP consigli. La differenza è che i proxy sono essenzialmente nuove classi artificiali create dal framework, mentre il postprocessing di tessitura / bytecode modifica quelli esistenti. Quest'ultimo è impossibile senza usare l'API di strumentazione che hai citato.

Per quanto riguarda le annotazioni, l'implementazione del tag <context:component-scan> eseguirà la scansione del percorso di classe per tutte le classi con le annotazioni Spring e creerà segnaposto di metadati Spring per esse. Successivamente vengono trattati come se fossero configurati tramite XML (o, per essere più precisi, entrambi vengono trattati allo stesso modo).

Sebbene Spring non esegua il byprocodice bytecode stesso, è possibile configurare l'agente di tessitura AspectJ che dovrebbe funzionare perfettamente con Spring, se i proxy non ti soddisfano.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top