injection framework dependency control java spring jvm internals

java - framework - spring boot dependency injection



Elementos internos de Spring Framework y otros contenedores de IoC (2)

He estado usando la primavera por algún tiempo, pero siempre me he preguntado cómo funciona, más específicamente, cómo cargan y tejen beans / clases marcadas solo con una interfaz o @annotation .

Para las declaraciones xml, es fácil ver cómo la primavera preprocesa mis beans (están declarados en el contexto xml que lee la primavera), pero para las clases marcadas solo con anotaciones, no puedo ver cómo funciona eso, ya que no lo hago pasar cualquier agente a la JVM o así.

Creo que hay algún enlace Java / JVM que te permite preprocesar las clases por algún tipo de criterio, pero no pude encontrar nada en los documentos.

¿Puede alguien señalarme algunos documentos? ¿Está relacionado con la API java.lang.instrument.ClassFileTransformer ?



Actualmente, de forma predeterminada, Spring no realiza ningún postproceso de bytecode ni para beans configurados en XML ni en anotación. En su lugar, los beans relevantes se envuelven en proxies dinámicos (consulte, por ejemplo, java.lang.reflect.Proxy en Java SDK). Los proxies dinámicos envuelven los objetos reales que utiliza e intercepta llamadas a métodos, lo que permite aplicar consejos AOP. La diferencia es que los proxies son esencialmente nuevas clases artificiales creadas por el framework, mientras que el tejer / bytecode postprocessing cambia los existentes. Esto último es imposible sin usar la API de Instrumentación que mencionaste.

En cuanto a las anotaciones, la implementación de la etiqueta <context:component-scan> escaneará el classpath para todas las clases con las anotaciones Spring y creará marcadores de posición de metadatos Spring para ellas. Después de eso, se tratan como si se configuraran a través de XML (o para ser más específicos, ambos se tratan de la misma manera).

Aunque Spring no codifica el postprocesamiento de byte en sí mismo, puede configurar el agente de tejido AspectJ que debería funcionar bien con Spring, si los proxies no lo satisfacen.