2008-10-23 11 views
20

He estado usando la primavera durante 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 @ anotación.Internals of Spring Framework y otros contenedores IoC

Para las declaraciones xml, es fácil ver cómo preprocesamos la primavera 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 funcionan, dado que No le paso ningún agente a la jvm más o menos.

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

¿Alguien me puede indicar algunos documentos? ¿Está relacionado con la API java.lang.instrument.ClassFileTransformer?

Respuesta

28

realidad en la primavera por defecto no hace ningún código de bytes posprocesamiento ni para XML, ni granos de anotación-configurado. En su lugar, beans relevantes se envuelven en proxies dinámicos (consulte, por ejemplo, java.lang.reflect.Proxy en el Java SDK). Los proxies dinámicos envuelven los objetos reales que usa e interceptan las llamadas al método , lo que permite aplicar los avisos 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 posprocesamiento 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.

+0

¡Gracias, gran respuesta! Estaba un poco desconcertado sobre cómo podría la primavera o cualquier otro marco acceder a mis clases sin que yo las suministrara al contenedor, pero ahora tiene sentido :) –

+0

Debo señalar que el uso de Proxy significa que debe codificar las interfaces para usar Spring sin tejer (Proxy solo funciona con interfaces) –

+1

No. Los proxies JDK solo funcionan con interfaces, los proxies CgLib también funcionan con las clases habituales. –

1

The Spring Framework download viene incluido con el código fuente, por lo que puede tomar el código usted mismo (dentro de la carpeta src) para averiguarlo.

The reference manual también es bastante largo (588 páginas si lo descargas as a PDF).

+3

Gracias, pero estaba buscando una forma de no sumergirse en la fuente de la primavera ... De todos modos, el PDF no menciona las partes internas de la primavera. –

+0

¡No entiendo por qué esto es downvoted! –

Cuestiones relacionadas